perm filename BAS10.MAC[DKH,LCS] blob
sn#140127 filedate 1975-01-09 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00006 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002
C00003 00003 TITLE BAS10 - BASIC COMPILER
C00032 00004 STDL: CAMN A,[ASCIZ .(.]
C00057 00005 MOVE [FILNAM,,LSTNAM] IF , WE HAVE LSTNAM
C00086 00006 TROA F,GENFLG
C00101 ENDMK
C⊗;
SUBTTL INITIALIZATION HOFFMAN 4/74
IFNDEF FTDEBUG,<FTDEBUG==1> ;FOR DDT COMPATIBILITY
IFNDEF FTLIST,<FTLIST==0>
IF1,<IFN FTDEBUG,<PRINTX COMPILING DEBUG FEATURES>
IFN FTLIST,<PRINTX UNABRIDGED LISTING SWITCH ON>>
LOC 137
XWD 201,62 ;VERSION
LOC 41
PUSHJ P,UUODIS
RELOC
Z=1 ;DEFINE AC'S
ST=2
A=3
BP=4
X=5
C=6
CH=7
JS=10
S1=11
S2=12
S3=13
T1=14
T2=15
F=16
P=17
SALL
CR==15 ;OCTAL CONSTANTS
LF==12
TAB==11
ALT==33
QUO==42
ARRFLG==1 ;FLAGS IN LH F
COMFLG==2
WNUMFL==4
TTYFLG==10
STREXP==20
UNAROP==40
INAC==100
ACPSHD==200
NOPUSH==400
SNGSTR==2000
FN1FLG==4000
FNEVFL==10000
INXFLG==20000
EXTFLG==40000
CCLENT==1 ;FLAGS IN RH F
DATFLG==2
EOJFLG==4
INTFLG==10
ONEFLG==20
LUPFLG==40
PASS2F==100
NOSORT==200
ILTFLG==400
IGTFLG==1000
IEQFLG==2000
NEGEXP==4000
READFL==10000
GENFLG==20000
IFE FTDEBUG,<TWOSEG>
OPDEF PUTCHR [1000,,0]
OPDEF PUTSTR [2000,,0]
OPDEF GOTO [3000,,0]
OPDEF FIX [4000,,0]
OPDEF FLOAT [5000,,0]
OPDEF OCTLFT [6000,,0]
OPDEF OCTRT [7000,,0]
OPDEF JOVFL [255440,,0]
DEFINE SIXMOV (A),<JSP JS,SIXADD ;TO TRANSFER FILENAMES
POINT 6,A>
DEFINE SETBP (A),<MOVEI BP,A
HRLI BP,↑O440700>
DEFINE WORT (A),<IRP A,<A: Z>> ;TO GENERATE SINGLE WORDS
DEFINE REMAC (A),<IRPC A, <MOVEI S2,"A"
IDPB S2,BP> ;TO COORDINATE WITH
MOVEI S2,"!" ; RUN UUO FOR "EX" AND
IDPB S2,BP ; "LOAD" COMMANDS
MOVEI S2,CR
IDPB S2,BP
MOVEI S2,LF
IDPB S2,BP>
DEFINE DIE (A),<JRST [OUTSTR [ASCIZ/A/]
EXIT]> ;MACRO TO BOMB OUT JOB
BUFA1: Z ;HOMEMADE BUFFERS
XWD 201,BUFA2+1
BLOCK 201
BUFA2: Z
XWD 201,BUFA1+1
BLOCK 201
BUFB1: Z
XWD 201,BUFB2+1
BLOCK 201
BUFB2: Z
XWD 201,BUFB1+1
BLOCK 201
RADIX 10
LINLEN==18 ;WORDS PER SOURCE LINE
LINBLK==1024/LINLEN ;LINES PER 1K CORE
IFN FTDEBUG,<LINBLK==LINBLK*15>
STKLEN==100
PDL: BLOCK STKLEN ;PUSHDOWN LIST
AUXLEN==100
AUXSTK: BLOCK AUXLEN
WORT <DEV,DATPT,STEMP,STRCT,OLDPT,FILCNT>
VAR: BLOCK 3
WORT <ISTATE,CURNUM,SCSNUM,CMSTPT,PDLTMP,ERRCNT,PTSTOR>
WORT <LSTDEV,MCBFPT,MCBFCT,DIM1,OLDCT,NEWCT,CHRCT,FNCCNT>
RBLOCK: BLOCK 6
SUBTTL I/O CONSIDERATIONS HOFFMAN 4/74
TMPNAM: SIXBIT .000BS1. ;TEMPORARY FILE NAME
SIXBIT .TMP. ; (FOR SORTED FILE)
BLOCK 2
TM1: SIXBIT .000BAS. ;CCL FILE
SIXBIT .TMP.
BLOCK 2
COMSTR: BLOCK 75 ;COMMAND STRING BUFFER
IBUF: BLOCK 3 ;BUFFERS
OBUF: BLOCK 3
OBF: BLOCK 3
OP0: Z ;LOWSEG OPEN BLOCKS
SRCDEV: SIXBIT .DSK. ; (MODIFIABLE DEVICES)
EXP IBUF
OP1: Z
OBJDEV: SIXBIT .DSK.
XWD OBUF,0
OP3: Z
SIXBIT .DSK.
EXP IBUF
FILNAM: BLOCK 4 ;LOOKUP/ENTER BLOCKS
SRCNAM: BLOCK 4
OBJNAM: BLOCK 4
LSTNAM: BLOCK 4
STRING: BLOCK LINLEN
STRTMP: BLOCK LINLEN
ACS: BLOCK 8
MACBUF: BLOCK 25 ;FOR MACRO CCL FILE
MACTMP: SIXBIT/MAC/
IWD: BLOCK 2
ACLST: ASCIZ/VAL/
ASCIZ/.T1/
ASCIZ/.T2/
ASCIZ/.T3/
ASCIZ/.T4/
NUSRFN==26
USRFNC: BLOCK NUSRFN
EOBOTH: ;END OF CORE FOR BOTH PASSES
VARS: BLOCK 572 ;SYMBOL TABLE SPACE
ASCNAM: BLOCK 2 ;ASCII NAME OF PROGRAM
FINX: Z ;HIGHEST INSTRUCTION INDEX
NMUARG==15
USRARG: BLOCK NMUARG
PROG: BLOCK LINLEN ;PRECAUTION FOR /N
DATARE: BLOCK 40 ;DATA AREA FOR /N
IFN FTDEBUG,<BLOCK LINLEN*LINBLK-40-LINLEN> ;SOURCE BUFFER SPACE
IFE FTDEBUG,<RELOC EOBOTH> ;(PASS 1)
F
LPPOIN: Z ;PASS 2 FOLLOWS
LPCOUN: Z
LPSTAK: BLOCK 15
TXTLIN: BLOCK LINLEN
IFE FTDEBUG,<RELOC ↑O400000> ;HIGH SEG BEGINS HERE
;
;
; AT THIS POINT THERE FOLLOW SEVERAL ROUTINES AND MACROS
; TO BE WRITTEN INTO THE OBJECT CODE IF NECESSARY. THEY
; ARE XLISTED SINCE THEIR ASCIZ EXPANSION WOULD TAKE UP
; TOO MUCH SPACE.
;
IFE FTLIST,<XLIST>
SUBTTL INITIAL FILE OUTPUT
BGNSTR: ASCIZ/
.T1=2
.T2=3
.T3=4
.T4=5
.X=6
.X2=7
ST=10
BP=11
DBP=12
VAL=13
RLC=14
.L=15
IO=16
PP=17
.JBFF==121
LOC 41
PUSHJ PP,UUOHNL
RELOC
OPDEF FIX [4000,,0]
OPDEF EXP [5000,,0]
OPDEF EXPI [6000,,0]
OPDEF IEXPI [7000,,0]
OPDEF IEXP [10000,,0]
RCFAC=400012
DEFINE RLOCA (A),<IRP A,<A=:RCFAC
RCFAC=RCFAC+1>>
RLOCA <INITIA,SCANB,INSUB,CONCAT,IFSTR,GETCOR,PRCOM,PRTAB>
RLOCA <PCRLF,PRSTR,TFLOT,INPTB,UUOHNL,ERRNCF,ERRRD,EXPO>
FORER.=:400010
TYPER.=:FORER.
RADIX 10
NEFGL:TEM1: Z
STHFLG: Z
INPFLG: Z
RESTRT: Z
LINCNT: BLOCK 15
STRING: BLOCK 15
INPTS: BLOCK 15
IOWHER: Z
PRSTAK: BLOCK 13
CRLF: BYTE (7) ↑O15,↑O12,0
GTSGTB: SIXBIT .SYS.
SIXBIT .BASHGH.
BLOCK 6
TMP: Z
/
SUBTTL MACRO FOR GENERATING LOOPS HOFFMAN 4/74
REPEAT 0,<
LOOPMC: ASCIZ/
LP1: BLOCK 15
LP2: BLOCK 15
LP3: BLOCK 15
>
LOOPMC: ASCIZ/
DEFINE LOOP (A,B,%C,%D,%E),<
MOVE .T1,LP1(.L)
FSB .T1,LP3(.L)
JRST %C
F'B: MOVEI .L,B
MOVE .T1,A
%C: MOVE .T3,LP3(.L)
FAD .T1,.T3
JUMPL .T3,%D
CAMLE .T1,LP2(.L)
JRST E'B
JRST %E
%D: CAMGE .T1,LP2(.L)
JRST E'B
%E: MOVEM .T1,A
>
DEFINE EOLOOP (B),<
JRST F'B
E'B:>
/
CHGTXT: ASCIZ" SKIPLE .T4
CAILE .T4,75
JRST [OUTSTR [ASCIZ .?CHANGE ERROR.]
EXIT]
;@JBFF NOT EMPTY
SETZM @.JBFF
PUSHJ PP,GETCOR
MOVE .T1,1
HRLI .T1,↑O440700
MOVEI .X,1
MOVE .T3,"
LIST
SUBTTL HISEG I/O AND MACRO DEFINITIONS HOFFMAN 4/74
OP17: ↑O17 ;HISEG (INALTERABLE)
SIXBIT .DSK. ; OPEN BLOCKS
Z
OP2: Z
SIXBIT .DSK.
XWD OBF,0
TMP1: SIXBIT/BAS/ ;CCL FILE SPACE
IOWD 75,COMSTR
RUNBLK: SIXBIT/SYS/ ;FOR NEXT PASS
SIXBIT/MACRO/
BLOCK 4
VALCOM: ASCIZ/VAL,/
CRLF: BYTE (7) CR,LF,0
SUBTTL ERROR RECOVERY HOFFMAN 4/74
DEFINE ERR(A,B),<
ERR'A: MOVEI T1,[ASCIZ/B/]
JRST ERROUT>
ERR MCP,MISSING CLOSING PARENTHESIS
ERR 2OP,TWO CONSECUTIVE OPERATORS
ERR ILF,ILLEGAL FUNCTION CALL
ERR ILD,ILLEGAL DELIMITER
ERR BSF,BAD STRING FORMULA
ERR NFO,NOTHING FOLLOWING OPERATOR
ERR NUN,BAD UNARY OPERATOR
ERR NDT,NO DATA TO RESTORE
ERR GTE,GOTO OR THEN EXPECTED
ERR BFN,BAD FUNCTION NAME
ERR IFA,ILLEGAL FUNCTION ARGUMENT
ERR NIA,NON-INTEGER FOUND WHERE INTEGER WAS EXPECTED
ERR RNF,RELATION NOT FOUND WHERE EXPECTED
ERR IVS,INVALID SUBSCRIPT
ERR TLA,TOO MANY ARGUMENTS
ERR FDT,FUNCTION DEFINED TWICE
ERR INP,ERROR IN INPUT STATEMENT
ERR MSD,MISSING DELIMITER
ERR KNR,KEYWORD NOT RECOGNIZED
ERR ILP,ILLEGAL LOOP PARAMETER
ERR COM,COMPILER ERROR
ERR INL,ILLEGALLY NESTED LOOP
ERR FMT,ILLEGAL FORMAT
ERR END,END OF LINE NOT FOUND WHERE EXPECTED
ERR ILE,ILLEGAL EXPRESSION
ERR 2UN,2 CONSECUTIVE UNARY OPERATORS
ERR UBP,UNBALANCED PARENTHESES
ERR OVF,OVERFLOW
ERR DIM,DIMENSIONING ERROR
; ERR NYI,FEATURE NOT YET IMPLEMENTED
DEFINE INSTR (A),<IRP A,<A'.: ASCIZ/ A />>
INSTR <MOVE,MOVEI,MOVEM,LOOP,JUMP>
SUBTTL SOURCE SCANNER HOFFMAN/PLAKUN/COURTNEY/LIPPINCOTT 3/74
REPEAT 0,<
STATES FOR SOURCE SCANNER:
1=INTEGER 2=FLOATING PT 3=VARIABLE [4=TEMPORARY FOR VAR]
5=STRING FUNC 6=OPERATOR [7=OPEN QUOTE] 8=STRING CONSTANT
9=DELIMITER 10=STRING VAR 11=NUM FUNC [12-14 TMP FLTPT STATES]
15=ARRAY VAR 16=STR ARR VAR 17=USRDEF FNC 18=USRDEF STRFNC
[19=TEMP FOR USRDEF FNCS] [20-29 TEMPORARY KEYWORD + FUNC STATES]
30+ KEYWORDS (SEE BELOW)
DELIMS: ,;()=\<>'
>
$INTEG==1
$FLOAT==2
$NUVAR==3
$TMNVR==4
$STFNC==5
$OPERA==6
$TMSTC==7
$STCON==8
$DELIM==9
$STVAR==10
$NUFNC==11
$TMFL1==12
$TMFL2==13
$TMFL3==14
$NUARR==15
$STARR==16
$UNUFN==17
$USTFN==18
$TMUSF==19
$TWENT==20
$TWNIN==29
$BGNKY==30
$INPUT==30
$DATA==31
$PRINT==32
$FOR==33
$DEF==34
$REM==35
$DIM==36
$FILES==37
$TOPS1==37
$IF==38
$LET==39
$GOTO==40
$NEXT==41
$END==42
$ON==43
$STOP==44
$TO==45
$GOSUB==46
$THEN==47
$STEP==48
$READ==49
$CHANG==50
$RETUR==51
$RANDO==52
$RESTO==53
$SCRAT==54
IFE FTLIST,<XLIST>
DELIM: EXP ",",";","(",")","=","\","<",">","'","#",":"
NUMDLM==.-DELIM
DEFINE KEYMAC (A), <IRP A,<ASCII/A/
Z>>
DEFINE KEYG5 (A), <IRP A,<ASCII/A/>>
KEYWD: KEYMAC <INPUT,DATA,PRINT,FOR,DEF,REM,DIM,FILES,IF,LET>
KEYMAC <GOTO,NEXT,END,ON,STOP,TO,GOSUB,THEN,STEP,READ>
KEYG5 <CHANGE,RETURN,RANDOM,RESTORE,SCRATCH>
NUMKEY==.-KEYWD ;NUMBER OF KEYWORDS
LIST
BASFNC: KEYG5 <RND,SIN,COS,ABS,INT,EXP,LOG,SQR,SNH>
KEYG5 <CSH,TNH,ATN>
BASONY: KEYG5 <SGN,TAB,TAN,LEN>
NUMBFN==.-BASFNC
F40FNC: KEYMAC <RAN,SIN,COS,ABS,AINT,EXP,ALOG,SQRT,SINH>
KEYMAC <COSH,TANH,ATAN>
STRFNC: KEYG5 <CHR$>
NUMSTF==.-STRFNC
SCAN: MOVE 0,[C,,ACS]
BLT 0,ACS+7
SETZB ST,STRING ;SET STATE TO 0
SETZB A,S1
SETZ S3,
TDZ F,[FN1FLG,,NEGEXP]
MOVE [STRING,,STRING+1]
BLT STRING+14
MOVE CH,[POINT 7,STRING] ;POINTER TO RESULTS
MOVE NEWCT
EXCH CHRCT
MOVEM OLDCT
MOVEM BP,OLDPT ;SAVE OLD POINTER
SCAN1: JSP JS,GETCHR ;GET A CHARACTER
CAIL C,"0" ;IS IT A DIGIT?
CAILE C,"9"
JRST NOTDGT ;NO
DIGIT: CAIE ST,$INTEG
JUMPN ST,NOT0 ;YES. ARE WE IN STATE 0?
MOVEI ST,$INTEG ;YES. SET STATE TO 1
MOVE S2,C
SUBI S2,"0"
IMULI A,10 ;BEGIN ACTUAL INTEGER
ADDI A,(S2)
JOV SCNERR
ONE: IDPB C,CH ;AND SAVE CHARACTER
JRST SCAN1 ;RETURN FOR ANOTHER
NOT0: CAIE ST,$FLOAT
JRST NOTFLO
MOVE S2,C
SUBI S2,"0"
SOJ S3,
FLOAT S2,S2
FMPRI A,(10.0)
FADR A,S2
JOV SCNERR
JRST ONE
NOTFLO: CAIE ST,$TMFL1
CAIN ST,$TMFL2
MOVEI ST,$TMFL3
CAIE ST,$TMFL3
JRST NOTM3
MOVE S2,C
SUBI S2,"0"
TRNE F,NEGEXP
MOVNS S2
IMULI S1,10
ADD S1,S2
JOV SCNERR
JRST ONE
NOTM3: CAIE ST,$NUVAR ;ARE WE IN STATE 3?
JRST NOT3 ;NO
MOVEI ST,$TMNVR ;AND GO INTO STATE 4
JRST ONE ;GET ANOTHER
NOT3: CAILE ST,$TWENT ;ARE WE IN STATE KEYWD?
JRST KEYVAR ;YES; SHOULDN'T BE
JRST EXT1 ;OTHERWISE DONE
NOTDGT: CAIN ST,$TMFL2
JRST RTRN2
CAIE C,"$" ;OTHER POSSIBILITIES: $
JRST NOTDOL
JUMPE ST,ERRSCN
CAIE ST,$NUVAR ;LEGAL ONLY IN
CAIN ST,$TMNVR ;STATES 3 AND 4
JRST STRVA
CAIE ST,$UNUFN
JRST NOTT0
MOVEI ST,$USTFN
JRST EXT
STRVA: IDPB C,CH ;MARKS TERMINATION
MOVEI ST,$STVAR ;OF VARIABLE NAME.
JRST SCAN1
NOTDOL: CAIN ST,$UNUFN
JRST EXT1
CAIL C,"A" ;DO WE HAVE A LETTER
CAILE C,"Z"
JRST NOTLET ;NO
JUMPN ST,NOTT0 ;YES; ARE WE IN STATE 0?
MOVEI ST,$NUVAR ;NO; GO INTO STATE 3
CAIN C,"F"
TLO F,FN1FLG
JRST ONE ;GET ANOTHER CHAR
NOTT0: CAIE C,"E"
JRST NOTTE
CAIN ST,$FLOAT
JRST ISFLOA
CAIN ST,$INTEG
TLNE F,WNUMFL
SKIPA
JRST ISFLO1
NOTTE: CAIN ST,$TMFL1
JRST RTRN1
CAIE ST,$NUVAR
JRST NOTNVR
MOVEI ST,$TWENT
CAIN C,"N"
TLNN F,FN1FLG
JRST NOTNVR
MOVEI ST,$TMUSF
JRST ONE
NOTNVR: CAIE ST,$TMUSF
JRST NOTUSF
MOVEI ST,$UNUFN
JRST ONE
NOTUSF: CAIGE ST,$TWENT ;IF IN KEYWORD,
JRST EXT1
CAIN ST,$TWNIN ;TOO BIG FOR KEYWORD?
JRST KEYVAR
AOJ ST,
IDPB C,CH ;PUT AWAY CHAR
MOVEI S1,NUMKEY-2 ;AND CHECK KEYWORD TABLE
MOVE S2,STRING
MOVE S3,STRING+1
KLP: CAMN S2,KEYWD(S1) ;FOR MATCH
CAME S3,KEYWD+1(S1)
JRST NOTHIS
LSH S1,-1 ;GET KEYWD #
MOVEI ST,$BGNKY(S1)
JRST EXT ;GOT ONE
NOTHIS: SUBI S1,2
JUMPGE S1,KLP
MOVNI S1,NUMBFN
FNCLP: CAMN S2,BASFNC+NUMBFN(S1)
JRST FNCGOT
AOJL S1,FNCLP
MOVNI S1,NUMSTF
SFLP: CAMN S2,STRFNC+NUMSTF(S1)
JRST STFGOT
AOJL S1,SFLP
JRST SCAN1
FNCGOT: MOVEI ST,$NUFNC
JRST EXT
STFGOT: MOVEI ST,$STFNC
JRST EXT
ISFLO1: MOVEI "."
IDPB CH
FLOAT A,A
ISFLOA: MOVE [STRING,,STRTMP]
BLT STRTMP+14
MOVEM ST,STEMP
MOVEI ST,$TMFL1
JRST ONE
RTRN1: IBP BP
RTRN2: REPEAT 2,<IBP BP>
SOJ BP,
MOVE ST,STEMP
MOVE [STRTMP,,STRING]
BLT STRING+14
JRST EXT
NOTLET: MOVEI T1,NUMDLM ;WE MUST NEXT CHECK FOR DELIMITER
DLP: CAMN C,DELIM-1(T1)
JRST YESDEL ;GOT ONE
SOJG T1,DLP
JRST NOTDEL ;NO, IT ISN'T.
YESDEL: CAIN ST,$TMFL1
JRST RTRN1
CAIN C,"("
JRST SEARR
YDEL1: JUMPN ST,EXT1 ;IF IN STATE 0, RETURN THE CHAR
MOVEI ST,$DELIM ;AND GO INTO STATE 9
IDPB C,CH
JRST EXT
SEARR: CAIN ST,$NUVAR
JRST YARR
CAIN ST,$TMNVR
JRST YARR
CAIE ST,$STVAR
JRST YDEL1
MOVEI ST,$STARR
JRST EXT1
YARR: MOVEI ST,$NUARR
JRST EXT1
NOTDEL: CAIE C,"+" ;DO WE HAVE AN OPERATOR?
CAIN C,"-"
JRST OPER1
CAIN ST,$TMFL1
JRST RTRN1
CAIE C,"*"
CAIN C,"/"
JRST OPER
CAIE C,"↑"
JRST NOTOPR
OPER: JUMPN ST,EXT1 ;YES; IF IN STATE 0,
MOVEI ST,$OPERA ;GO INTO 6
IDPB C,CH ;AND RETURN THE OPERATOR
CAIE C,"*"
JRST EXT
JSP JS,GETCHR
CAIE C,"*" ;IS IT EXPONENTIATION?
JRST EXT1 ;NO
MOVEI C,"↑" ;OTHERWISE, REPLACE WITH "↑"
DPB C,[POINT 7,STRING,6] ; IN C AND STRING
JRST EXT
OPER1: CAIE ST,$TMFL1
JRST OPER
MOVEI ST,$TMFL2
CAIN C,"-"
TRO F,NEGEXP
JRST ONE
NOTOPR: CAIE C,QUO ;DO WE HAVE A QUOTE?
JRST NOTQUO
JUMPN ST,EXT1 ;IF WE HAD SOMETHING, WE'RE DONE
MOVEI ST,$TMSTC ;YES, GO INTO STATE 7
QLP: JSP JS,GETCHR ;AND KEEP GOING UNTIL
CAIN C,QUO ;WE GET ANOTHER QUOTE
JRST QUODON
IDPB C,CH
JRST QLP
QUODON: MOVEI ST,$STCON ;QUOTE DONE; GO INTO STATE 8
JRST EXT ;AND RETURN
NOTQUO: CAIE C,"." ;IS IT A PERIOD?
JRST ERRSCN ;IF NOT, IT'S NOT LEGAL
CAILE ST,$INTEG ;THIS IS ONLY GOOD IN STATE 1
JRST ERRSCN ;OR 0
MOVEI ST,$FLOAT ;IN WHICH CASE WE HAVE FLT PT
FLOAT A,A
SETZ S3,
TRZ F,NEGEXP
JRST ONE
GETCHR: ILDB C,BP ;SUBROUTINE TO GET ONE CHARACTER
CAIE C,CR ;AND SEE IF END OF LINE
JRST UPDCHR ;NO
JUMPN ST,NT00 ;YES. ARE WE IN STATE 0?
SETO ST, ;IF SO, SET STATE -1 (END OF LINE)
JRST EXT ;AND EXIT
NT00: CAIN ST,$TMSTC ;STATES KEYWD AND 7
JRST ERRSCN
CAIGE ST,$TWENT
JRST EXT1
KEYVAR: PUSHJ P,STAKBK
KEYVR1: ILDB A,BP
AOS NEWCT
CAIGE A,QUO-1
JRST KEYVR1
LSH A,29
MOVEM A,STRING
MOVEI ST,$NUVAR
JRST LEAVE
UPDCHR: AOS T1,NEWCT
CAIE C,TAB
JRST NOTTAB
AOJ T1,
IDIVI T1,8
JUMPN T2,UPDCHR
NOTTAB: CAIE ST,$TMSTC
CAIL C,QUO-1
SKIPA
JRST GETCHR
JRST (JS)
EXT1: SOS NEWCT
SOJ BP, ;OTHERWISE, WE ARE DONE.
REPEAT 4,<IBP BP>
EXT: TLZ F,WNUMFL
CAIN ST,$TMUSF
JRST ERRSCN
CAIL ST,$TWENT
CAILE ST,$TWNIN
SKIPA
JRST KEYVAR
CAIN ST,$TMFL3
MOVEI ST,$FLOAT
CAIE ST,$FLOAT
JRST NOTFLT
ADD S1,S3
JUMPE S1,LEAVE
JUMPL S1,FLTDIV
FMPRI A,(10.0)
SOJG S1,.-1
JRST LEAVE
FLTDIV: FDVRI A,(10.0)
AOJL S1,.-1
JRST LEAVE
NOTFLT: CAIN ST,$TMNVR
MOVEI ST,$NUVAR
CAIE ST,$NUVAR
CAIN ST,$OPERA
MOVE A,STRING
CAIE ST,$DELIM
CAIN ST,$STVAR
MOVE A,STRING
CAIE ST,$NUARR
CAIN ST,$STARR
MOVE A,STRING
CAIE ST,$UNUFN
CAIN ST,$USTFN
MOVE A,STRING
CAIN ST,$STFNC
MOVE A,STRING
; TEMP
CAIN ST,$NUFNC
MOVE A,STRING
;TEMP
LEAVE: MOVE 0,[ACS,,C]
BLT 0,T2
POPJ P,
ERRSCN: MOVNI ST,2
JRST LEAVE
SUBTTL EXPRESSION EVALUATOR DINGER 7/74
;OPERATION CODES:
UNSUB==0
ADDD==1
SUBB==2
MULL==3
DIVV==4
EXPP==5
CNCT0==6
CNCT1==7
CNCTL==8
FNCARG==9
FNCC==10
ARSUB1==11
ARSUB2==12
PUSH1==13
POP1==14
STEVAL: TLOA F,STREXP
EVALI: TROA F,INTFLG
EVAL: TRZ F,INTFLG
SETZM FNCCNT
MOVE JS,[IOWD AUXLEN,AUXSTK]
PUSH JS,P
PUSHJ JS,EXPREV
POP JS,0
HRRZS 0
HRRZ Z,P
SUB 0,Z
MOVN C,0
STKLP: POP P,Z
PUSH JS,Z
AOJL 0,STKLP
PUSHJ P,CODGEN
TLZ F,STREXP
POPJ P,
EXPREV: PUSHJ P,SCAN
JUMPL ST,ERRILE
CAIE ST,$DELIM
JRST EXPRE0
CAME A,[ASCIZ .(.]
JRST ERRILE
EXPRE0: PUSHJ P,STAKBK
TLNE F,STREXP
JRST STEXEV
EXPRE1: TLZ F,UNAROP
PUSHJ JS,GTITM
PUSHJ JS,GTOP
POPJ JS,
GTITM: PUSHJ P,SCAN
GOTO TAB7
UNARY: CAME A,[ASCIZ/+/]
CAMN A,[ASCIZ/-/]
SKIPA
JRST ERRNUN
PUSH JS,A
TLOE F,UNAROP
JRST ERR2UN
PUSHJ JS,GTITM
POP JS,A
CAMN A,[ASCIZ/+/]
POPJ JS,
SETZ
MOVEI ST,$OPERA
PUSH P,ST
PUSH P,0
TLZ F,UNAROP
POPJ JS,
CONST: PUSH P,ST
PUSH P,A
POPJ JS,
DLRCRS: CAME A,[ASCIZ .(.]
JRST ERRNFO
RCRS: PUSHJ JS,EXPREV
PUSHJ P,SCAN
CAMN A,[ASCIZ .).]
POPJ JS,
JRST ERRUBP
FUNC: PUSH P,ST
PUSH P,A
PUSH JS,F
PUSH JS,FNCCNT
PUSHJ P,SCAN
CAMN A,[ASCIZ .(.]
JRST FUNCLP
PUSHJ P,STAKBK
JRST FUNCDN
FUNCLP: PUSHJ P,LKAHD
PUSHJ JS,EXPREV
AOS FNCCNT
MOVEI 0,FNCARG
MOVEI Z,$OPERA
PUSH P,Z
PUSH P,0
PUSHJ P,SCAN
CAMN A,[ASCIZ .).]
JRST FUNCDN
CAME A,[ASCIZ .,.]
JRST ERRILF
JRST FUNCLP
FUNCDN: MOVE FNCCNT
POP JS,FNCCNT
SUB 0,FNCCNT
HRLZS
HRRI FNCC
MOVEI Z,$OPERA
PUSH P,Z
PUSH P,0
POP JS,F
POPJ JS,
ARRIT: PUSH P,ST
PUSH P,A
ARRSBS: PUSHJ P,SCAN ;FOR PARENTHESIS
PUSH JS,F
TLZ F,STREXP
PUSHJ JS,EXPREV
PUSHJ P,SCAN
CAMN A,[ASCIZ .).]
JRST ARRPRN
CAME A,[ASCIZ","]
JRST ERRMCP
PUSHJ JS,EXPREV
PUSHJ P,SCAN
CAME A,[ASCIZ .).]
JRST ERRMCP
MOVEI 0,ARSUB2
SKIPA
ARRPRN: MOVEI 0,ARSUB1
MOVEI Z,$OPERA
PUSH P,Z
PUSH P,0
POP JS,F
POPJ JS,
LKAHD: PUSH P,BP
PUSH P,OLDPT
PUSH P,NEWCT
PUSH P,CHRCT
PUSH P,OLDCT
LKAHD1: PUSHJ P,SCAN
CAMN A,[ASCIZ .(.]
JRST LKAHD1
GOTO TAB9
LKAHDS: TLOA F,STREXP
LKAHDN: TLZ F,STREXP
POP P,OLDCT
POP P,CHRCT
POP P,NEWCT
POP P,OLDPT
POP P,BP
POPJ P,
GTOP: PUSHJ P,SCAN
CAIE ST,$OPERA
JRST DLMRT
PUSHJ JS,BINOP
JRST GTOP
DLMRT: PUSHJ P,STAKBK
POPJ JS,
BINOP: MOVNI Z,NUMOPS
BINOP1: HLLZ 0,BINOPS+NUMOPS(Z)
CAMN A,0
JRST BINOP2
AOJL Z,BINOP1
JRST ERRILE ;SHOULDN'T GET HERE
BINOP2: HRRZ T1,BINOPS+NUMOPS(Z)
PUSH JS,T1
,BINOPS+NUMOPS(Z)
PUSH JS,T1
PUSHJ JS,GTITM
MOVE T1,(JS)
PUSHJ JS,@BOPDSP-1(T1)
MOVEI 0,$OPERA
PUSH P,0
POP JS,0
PUSH P,0
POPJ JS,
BINOPS: BYTE (7)"↑"(29)EXPP
BYTE (7)"/"(29)DIVV
BYTE (7)"*"(29)MULL
BYTE (7)"-"(29)SUBB
BYTE (7)"+"(29)ADDD
NUMOPS==.-BINOPS
BOPDSP: BADSUB
BADSUB
BMULDV
BMULDV
BEXP
LOWOPR: PUSHJ P,STAKBK
BEXP: POPJ JS,
BMULDV: PUSHJ P,SCAN
CAIE ST,$OPERA
JRST LOWOPR
CAME A,[ASCIZ .↑.]
JRST LOWOPR
PUSHJ JS,BINOP
JRST BMULDV
BADSUB: PUSHJ P,SCAN
CAIE ST,$OPERA
JRST LOWOPR
CAME A,[ASCIZ .+.]
CAMN A,[ASCIZ .-.]
JRST LOWOPR
PUSHJ JS,BINOP
JRST BADSUB
STEXEV: PUSH JS,C
SETZ C,
TLZ F,SNGSTR
PUSHJ JS,GTSITM
STEXE1: PUSHJ JS,STROP
PUSHJ JS,STFIN
POP JS,C
POPJ JS,
GTSITM: PUSHJ P,SCAN
GOTO TAB2
STDL: CAMN A,[ASCIZ .(.]
AOJA C,GTSITM
JRST ERRNFO
STARIT: SKIPA Z,[PUSHJ JS,ARRIT]
STFUNC: MOVE Z,[PUSHJ JS,FUNC]
TLNN F,SNGSTR
JRST STNOPP
MOVEI 0,$OPERA
PUSH P,0
MOVEI 0,PUSH1
PUSH P,0
PUSH JS,C
XCT Z
POP JS,C
MOVEI 0,$OPERA
PUSH P,0
MOVEI 0,POP1
PUSH P,0
POPJ JS,
STNOPP: XCT Z
POPJ JS,
STROP: PUSHJ P,SCAN
JUMPL ST,STKBK2
CAIN ST,$OPERA
JRST STOPR
JUMPE C,STKBK2
CAMN A,[ASCIZ .).]
SOJGE C,STROP
STKBK2: PUSHJ P,STAKBK
POPJ JS,
STOPR: CAME A,[ASCIZ .+.]
JRST STKBK2
TLOE F,SNGSTR
JRST NXTCT
MOVEI A,CNCT0
PUSH P,ST
PUSH P,A
NXTCT: PUSHJ JS,GTSITM
MOVEI A,CNCT1
MOVEI ST,$OPERA
PUSH P,ST
PUSH P,A
JRST STROP
STFIN: JUMPN C,ERRUBP
TLZN F,SNGSTR
POPJ JS,
MOVEI A,CNCTL
MOVEI ST,$OPERA
PUSH P,ST
PUSH P,A
POPJ JS,
CODGEN: SETZM FNCCNT
POP JS,ST
PUSH P,ST
POP JS,A
PUSH P,A
CODLP: CAIN C,2
JRST CODDON
POP JS,ST
POP JS,A
CAIN ST,$OPERA
JRST CDOPER
PUSH P,ST
PUSH P,A
JRST CODLP
CDOPER: SUBI C,2
HRRZ ST,A
JRST @DOOP(ST)
DOOP: CDUNSB
CDADD
CDSUB
CDMULT
CDDIV
CDEXP
CDCNC0
CDCNC1
CDCNCL
CDFNRG
CDFNC
CDAR
CDAR
CDPSH1
CDPOP1
CDUNSB: MOVE 0,-1(P)
CAILE 0,$FLOAT
JRST CDUSB2
MOVE 0,(P)
MOVNM 0,(P)
JRST CODLP
CDUSB2: TLNN 0,INAC
JRST CDUSB3
PUTSTR [ASCIZ/ MOVNS /]
PUTSTR (P)
PUTSTR COMMA
PUTSTR (P)
PUTSTR CRLF
JRST CODLP
CDUSB3: PUSHJ P,GETAC
PUTSTR [ASCIZ/ MOVN /]
PUTSTR T1
PUTSTR COMMA
PUSHJ JS,GTVAR
MOVEM T1,(P)
MOVE 0,-1(P)
TLO 0,INAC
MOVEM 0,-1(P)
JRST CODLP
COMMA: ASCIZ/,/
CDMULT: MOVEI T2,1
SKIPA
CDADD: SETZ T2,
SUBI C,2
POP P,A
POP P,ST
MOVE 0,-1(P)
CAILE ST,$FLOAT
JRST CDADD1
CAILE 0,$FLOAT
JRST CDADD2
SUB 0,ST
JUMPE 0,CDADDC
CAIN ST,1
JRST CDADC2
EXCH A,(P)
EXCH ST,-1(P)
CDADC2: FLOAT A,A
CDADCF: XCT FLOP(T2)
JOVFL ERROVF
JRST CODLP
CDADDC: CAIE ST,1
JRST CDADCF
XCT INTOP(T2)
JOVFL ERROVF
JRST CODLP
INTOP: ADDM A,(P)
IMULM A,(P)
SUBM A,(P)
PUSHJ JS,DIVDFL
DIVDFL: AOS 0,-1(P)
FLOAT A,A
FLOAT 0,(P)
FDVR A,0
MOVEM A,(P)
POPJ JS,
FLOP: FADRM A,(P)
FMPRM A,(P)
FSBRM A,(P)
FDVRM A,(P)
CDADD1: CAILE 0,$FLOAT
JRST CDADVR
EXCH A,(P)
EXCH ST,-1(P)
CDADD2: MOVE 0,-1(P)
TLOE 0,INAC
JRST CDADD3
MOVEM 0,-1(P)
PUSHJ P,GETAC
PUSHJ JS,GTVRAC
MOVEM T1,(P)
CDADD3: CAIE ST,$FLOAT
FLOAT A,A
PUTSTR @FOPST(T2)
PUSHJ JS,GTFLT
JRST CODLP
FOPST: [ASCIZ/ FADR/]
[ASCIZ/ FMPR/]
[ASCIZ/ FSBR/]
[ASCIZ/ FDVR/]
[ASCIZ/ EXP/]
GTFLT: TRNN A,-1
PUTCHR ["I"]
PUTCHR [" "]
PUTSTR (P)
PUTSTR COMMA
TRNE A,-1
PUTCHR ["["]
PUTSTR [ASCIZ/↑O/]
OCTLFT A
TRNN A,-1
JRST FLTOUT
OCTRT A
PUTCHR ["]"]
FLTOUT: PUTSTR CRLF
POPJ JS,
CDADVR: TLNE 0,INAC
JRST CDADV2
TLON ST,INAC
JRST CDADV1
CDADV0: EXCH A,(P)
EXCH ST,-1(P)
JRST CDADV2
CDADV1: PUSHJ P,GETAC
PUSH P,A
PUSHJ JS,GTVRAC
POP P,A
MOVE A,T1
TLO ST,INAC
JRST CDADV0
CDADV2: MOVE 0,-1(P)
TLNE 0,ACPSHD
PUSHJ JS,RSTRAC
PUTSTR @FOPST(T2)
PUTCHR [" "]
PUTSTR (P)
PUTSTR COMMA
PUSH P,A
PUSHJ JS,GTVAR
POP P,A
TLNN ST,INAC
JRST CODLP
MOVE T1,A
PUSHJ P,FREEAC
JRST CODLP
CDDIV: MOVEI T2,3
SKIPA
CDSUB: MOVEI T2,2
SUBI C,2
POP P,A
POP P,ST
MOVE 0,-1(P)
CAILE ST,$FLOAT
JRST CDSUB1
CAILE 0,$FLOAT
JRST CDADD2
SUB 0,ST
JUMPE 0,CDSUBC
CAIN ST,$INTEG
FLOAT A,A
CDSBCF: EXCH A,(P)
MOVEI ST,$FLOAT
EXCH ST,-1(P)
CAIN ST,$INTEG
FLOAT A,A
XCT FLOP(T2)
JOVFL ERROVF
JRST CODLP
CDSUBC: CAIE ST,1
JRST CDSBCF
EXCH A,(P)
EXCH ST,-1(P)
XCT INTOP(T2)
JOVFL ERROVF
JRST CODLP
CDSUB1: CAILE 0,$FLOAT
JRST CDSBVR
CAIE 0,$INTEG
JRST CDSUB2
FLOAT T1,(P)
MOVEM T1,(P)
CDSUB2: PUSHJ P,GETAC
PUSHJ JS,GTINT1
CDSBVR: TLNE 0,INAC
JRST CDADV2
EXCH A,(P)
EXCH ST,-1(P)
JRST CDADV1
GTINT1: SETO Z,
MOVE 0,(P)
TRCN 0,-1
SETZ Z,
TRCN 0,-1
MOVEI Z,1
JUMPL Z,GTFULL
PUSH JS,Z
PUTSTR [ASCIZ/ HRL/]
POP JS,Z
PUTSTR ZOROI(Z)
PUTSTR T1
PUTSTR [ASCIZ/,↑O/]
OCTLFT (P)
PUTSTR CRLF
JRST GTINRT
GTFULL: PUTSTR MOVE.
PUTSTR T1
PUTSTR [ASCIZ/,[↑O/]
OCTLFT (P)
OCTRT (P)
PUTSTR [ASCIZ/]
/]
GTINRT: MOVEM T1,(P)
MOVE 0,[INAC,,$NUVAR]
MOVEM 0,-1(P)
POPJ JS,
ZOROI: ASCIZ/ZI /
ASCIZ/OI /
CDEXP: SUBI C,2
MOVEI T2,4
POP P,A
POP P,ST
MOVE 0,-1(P)
CAILE 0,$FLOAT
JRST CDEXP1
CAIL 0,$FLOAT
JRST CDCEXP
FLOAT T1,(P)
MOVEM T1,(P)
AOS ,-1(P)
CDCEXP: PUSHJ P,GETAC
PUSHJ JS,GTINT1
CDCEX1: CAILE ST,$FLOAT
JRST CDADV2
CAILE ST,$INTEG
JRST CDADD3
PUTSTR [ASCIZ/ IEXP/]
PUSHJ JS,GTINT
JRST CODLP
CDEXP1: TLOE 0,INAC
JRST CDCEX1
PUSHJ P,GETAC
PUSH JS,0
PUSHJ JS,GTVRAC
POP JS,0
MOVEM T1,(P)
MOVEM 0,-1(P)
JRST CDCEX1
GTVRAC: PUTSTR MOVE.
PUTSTR T1
PUTSTR COMMA
GTVAR: PUTSTR (P)
TLNN F,FNEVFL
JRST VAREND
MOVNI Z,NMUARG
PUSH JS,A
MOVE A,(P)
UARCHK: CAMN A,USRARG+NMUARG(Z)
JRST UARPUT
AOJL UARCHK
JRST VAREND-1
UARPUT: PUTCHR ["%"]
POP JS,A
VAREND: PUTSTR CRLF
POPJ JS,
GTINT: TLNN A,-1
PUTCHR ["I"]
PUTCHR [" "]
PUTSTR (P)
PUTSTR COMMA
TLNE A,-1
PUTCHR ["["]
PUTSTR [ASCIZ/↑O/]
TLNE A,-1
OCTLFT A
OCTRT A
TLNE A,-1
PUTCHR ["]"]
PUTSTR CRLF
POPJ JS,
CDFNRG: SUBI C,1
MOVE T1,(P)
MOVE T2,-1(P)
TLZE T2,INAC
JRST CDFNMM
CAILE T2,$FLOAT
JRST CDFNVR
MOVE T1,(P)
CAIG T2,$INTEG
FLOAT T1,(P)
MOVEM T1,(P)
MOVEI T2,$FLOAT
MOVEM T2,-1(P)
PUSHJ P,GTACNP
PUSHJ JS,GTINT1
CDFNMM: MOVEM T1,(P)
MOVE T2,ARGTYP(T2)
MOVEM T2,-1(P)
PUTSTR MOVEM.
PUTSTR (P)
PUTSTR [ASCIZ/,Z/]
MOVE T1,FNCCNT
PUSHJ P,DCASC1
PUTSTR [ASCIZ/#
/]
AOS FNCCNT
POP P,T1
PUSHJ P,FREEAC
JRST CODLP
CDFNVR: PUSHJ P,GETAC
CAIN T2,$STCON
JRST CDFNST
PUSHJ JS,GTVRAC
JRST CDFNMM
CDFNST: PUTSTR MOVEI.
PUTSTR T1
PUTSTR [ASCIZ/,S/]
PUSHJ P,DECASC
AOS STRCT
PUTSTR CRLF
JRST CDFNMM
DEFINE LASC (N),<
BYTE (7)"N"
>
ARGTYP: LASC 0
LASC 0
LASC 2
LASC 2
LASC 0
LASC 5
LASC 0
REPEAT 2,<LASC 0
LASC 5>
LASC 2
REPEAT 3,<LASC 0>
REPEAT 2,<LASC 2
LASC 5>
LASC 0
CDFNC: HLRZ T2,A
JUMPE T2,FNCDN0
SUB C,T2
CDFNLP: POP P,0
PUSH JS,0
SOJG T2,CDFNLP
HLRZ T2,A
FNCDN0: POP P,A
POP P,ST
PUTSTR [ASCIZ/ JSA IO,/]
PUSHJ P,OUTFNC
TLO F,EXTFLG
CAIE ST,$USTFN
CAIN ST,$UNUFN
PUSHJ P,EXTCHK
TLZE F,EXTFLG
PUTSTR [ASCIZ/##/]
PUTSTR CRLF
JUMPE T2,FNCDN2
PUSH P,C
MOVN C,T2
FNCDN1: PUTSTR JUMP.
POP JS,T1
PUTSTR T1
PUTSTR [ASCIZ/,Z/]
MOVE T1,FNCCNT
ADD T1,C
PUSHJ P,DCASC1
PUTSTR CRLF
AOJL C,FNCDN1
POP P,C
FNCDN2: MOVE 0,FNCCNT
SUB 0,T2
MOVEM 0,FNCCNT
PUSHJ P,GETAC
PUTSTR MOVE.
PUTSTR T1
PUTSTR [ASCIZ/,0
/]
MOVEI T2,$NUVAR
CAIE ST,$USTFN
CAIN ST,$STFNC
MOVEI ST,$STVAR
TLO T2,INAC
PUSH P,T2
PUSH P,T1
JRST CODLP
EXTCHK: TLZ F,EXTFLG
MOVNI Z,NUSRFN
UFNSRC: CAMN A,USRFNC+NUSRFN(Z)
JRST UFNEQ
AOJL Z,UFNSRC
TLO F,EXTFLG
UFNEQ: POPJ P,
OUTFNC: CAIE ST,$USTFN
CAIN ST,$UNUFN
JRST OUTUFN
CAIN ST,$NUFNC
JRST NUTFNC
MOVNI Z,NUMSTF
FNSTSR: CAMN A,STRFNC+NUMSTF(Z)
JRST OUTUFN
AOJL Z,FNSTSR
JRST ERRCOM
NUTFNC: MOVNI Z,NUMBFN
FNSRCH: CAMN A,BASFNC+NUMBFN(Z)
JRST FNEQ
AOJL Z,FNSRCH
JRST ERRCOM
FNEQ: MOVEI 0,BASFNC+NUMBFN(Z)
CAIL 0,BASONY
JRST OUTUFN
ASH Z,1
PUTSTR F40FNC+NUMBFN*2(Z)
POPJ P,
OUTUFN: PUTSTR A
POPJ P,
CDAR: MOVE ST,-1(P)
CAIE ST,$INTEG
CAIN ST,$FLOAT
JRST CDARCN
PUTSTR [ASCIZ/ FIX .X,/]
PUSHJ JS,GTVAR
MOVE T1,(P)
TLZE ST,INAC
PUSHJ P,FREEAC
CAIE A,ARSUB2
JRST CDARGT
CDAR2: POP P,0
POP P,0
PUTSTR [ASCIZ/ IMUL .X,/]
PUTSTR -2(P)
PUTSTR [ASCIZ/..
/]
SUBI C,2
AOJ A,
MOVE ST,-1(P)
CAIE ST,$INTEG
CAIN ST,$FLOAT
JRST CDARCN
PUSHJ P,GTACNP
PUTSTR [ASCIZ/ FIX /]
PUTSTR T1
PUTSTR COMMA
PUSHJ JS,GTVAR
PUTSTR [ASCIZ/ ADD .X,/]
PUTSTR T1
PUTSTR CRLF
PUSHJ P,FREEAC
CDARGT: POP P,0
POP P,0
PUSHJ P,GETAC
PUTSTR MOVE.
PUTSTR T1
PUTSTR COMMA
PUTSTR (P)
PUTCHR ["."]
CAIL A,ARSUB2
PUTSTR [ASCIZ/.+1/]
PUTSTR [ASCIZ/(.X)
/]
CDARRT: MOVEM T1,(P)
MOVE ST,-1(P)
MOVEI T1,$NUVAR
CAIN ST,$STARR
MOVEI T1,$STVAR
TLO T1,INAC
MOVEM T1,-1(P)
SUBI C,2
JRST CODLP
CDARCN: MOVE T1,(P)
CAIE ST,$INTEG
FIX T1,(P)
MOVEM T1,(P)
CAIE A,ARSUB2
JRST CDARC1
PUTSTR MOVEI.
PUTSTR [ASCIZ/.X,↑O/]
OCTRT (P)
PUTSTR CRLF
JRST CDAR2
CDARC1: POP P,T2
POP P,0
PUSHJ P,GETAC
PUTSTR MOVE.
PUTSTR T1
PUTSTR COMMA
PUTSTR (P)
PUTCHR ["."]
CAIL A,ARSUB2
PUTSTR [ASCIZ/.+1/]
PUTSTR [ASCIZ/+↑O/]
OCTRT T2
CAIL A,ARSUB2
PUTSTR [ASCIZ/(.X)/]
PUTSTR CRLF
JRST CDARRT
CDPSH1: PUTSTR [ASCIZ/ PUSH PP,1
/]
JRST CODLP
CDPOP1: PUTSTR [ASCIZ/ POP PP,1
/]
JRST CODLP
CDCNC0: PUTSTR [ASCIZ . PUSHJ PP,GETCOR
MOVEM 1,CORPTR#
HRLI 1,↑O440700
.]
ADDI C,2
CDCNC1: MOVE ST,-1(P)
CAIE ST,$STCON
JRST CDCNCV
PUTSTR [ASCIZ/ MOVEI 0,S/]
PUSHJ P,DECASC
PUTSTR CRLF
AOS STRCT
JRST CDCNCD
CDCNCV: PUTSTR [ASCIZ/ MOVE 0,/]
PUSHJ JS,GTVAR
MOVE T1,(P)
TLNE ST,INAC
PUSHJ P,FREEAC
CDCNCD: PUTSTR [ASCIZ/ PUSHJ PP,CONCAT
/]
POP P,0
POP P,0
SUBI C,2
JRST CODLP
CDCNCL: PUTSTR [ASCIZ/ SETZ
IDPB 1
/]
PUSHJ P,GETAC
PUTSTR MOVE.
PUTSTR T1
PUTSTR [ASCIZ/,CORPTR
/]
MOVEI 0,$STVAR
TLO 0,INAC
PUSH P,0
PUSH P,T1
JRST CODLP
GTACNP: TLO F,NOPUSH
GETAC: MOVNI Z,4
GETLP: MOVE T1,ACLST+4(Z)
TRON T1,7
JRST GOTAC
AOJL Z,GETLP
JRST NOACS
GOTAC: MOVEM T1,ACLST+4(Z)
TRZ T1,7
TLZ F,NOPUSH
POPJ P,
NOACS: TLZE F,NOPUSH
JRST GOTAC
HRRZ Z,P
NOACLP: SUBI Z,2
HRRZ 0,(Z)
CAIE 0,$NUVAR
CAIN 0,$STVAR
JRST ITINAC
JRST NOACLP
ITINAC: MOVE 0,(Z)
TLNN 0,INAC
JRST NOACLP
TLO 0,ACPSHD
MOVEM 0,(Z)
MOVNI Z,4
ACZER: MOVE T1,ACLST+4(Z)
TRZ T1,7
MOVEM T1,ACLST+4(Z)
AOJL Z,ACZER
MOVE T1,ACLST+4
TRO T1,7
MOVEM T1,ACLST+4
TRZ T1,7
PUTSTR [ASCIZ/ PUSH PP,VAL
PUSH PP,.T1
PUSH PP,.T2
PUSH PP,.T3
/]
POPJ P,
RSTRAC: MOVE 0,ACLST+4
TROE 0,7
JRST RSTR2
PUTSTR [ASCIZ/ MOVE .T4,/]
PUTSTR A
PUTSTR CRLF
MOVE A,[ASCIZ/.T4/]
RSTR2: MOVNI Z,5
RSTRLP: MOVE 0,ACLST+5(Z)
TRZ 0,7
MOVEM 0,ACLST+5(Z)
AOJL Z,RSTRLP
MOVE 0,-1(P)
TLZ 0,ACPSHD
MOVEM 0,-1(P)
PUTSTR [ASCIZ/ POP PP,.T3
POP PP,.T2
POP PP,.T1
POP PP,VAL
/]
POPJ JS,
FREEAC: MOVNI Z,5
FREELP: MOVE 0,ACLST+5(Z)
TRZ 0,7
CAME 0,T1
AOJL Z,FREELP
MOVEM 0,ACLST+5(Z)
POPJ P,
CODDON: MOVE 0,-1(P)
CAIE 0,$INTEG
CAIN 0,$FLOAT
JRST CDDNCN
CAIN 0,$STCON
JRST CDDSCN
TLZN 0,INAC
JRST CDDNMM
TRNE F,INTFLG
JRST CDDNMM
MOVE 1,(P)
CAMN 1,[ASCIZ/VAL/]
JRST CODRT
CDDNMM: TRNE F,INTFLG
JRST CDDNFX
MOVE T1,[ASCIZ/VAL/]
PUSHJ JS,GTVRAC
JRST CODRT
CDDNFX: PUTSTR [ASCIZ/ FIX VAL,/]
PUSHJ JS,GTVAR
JRST CODRT
CDDSCN: PUTSTR [ASCIZ/ MOVEI VAL,S/]
PUSHJ P,DECASC
PUTSTR CRLF
AOS STRCT
JRST CODRT
CDDNCN: CAIE 0,$INTEG
JRST CDDNCF
TRZE F,INTFLG
JRST CDDNCI
FLOAT A,(P)
MOVEM A,(P)
CDDNCF: TRNN F,INTFLG
JRST CDDNFL
PUTSTR [ASCIZ/ FIX VAL,[↑O/]
OCTLFT (P)
OCTRT (P)
PUTSTR [ASCIZ/]
/]
JRST CODRT
CDDNCI: MOVE A,[ASCIZ/VAL/]
EXCH A,(P)
PUTSTR [ASCIZ . MOVE.]
PUSHJ JS,GTINT
JRST CODRT
CDDNFL: MOVE T1,[ASCIZ/VAL/]
PUSHJ JS,GTINT1
CODRT: POP P,T1
POP P,ST
TLNE ST,INAC
PUSHJ P,FREEAC
MOVE T1,[ASCIZ/VAL/]
PUSHJ P,FREEAC
POPJ P,
SUBTTL DISPATCH TABLES HOFFMAN/COURTNEY 4/74
TAB1: $INPUT,,INPT
$READ,,REED
$DATA,,RLINE
$PRINT,,PRNT
$LET,,LETT
$GOTO,,GO2
$IF,,IF
$FOR,,FORLP
$NEXT,,ENDLP
$END,,EOFB
$FILES,,RLINE
$GOSUB,,GOSUB
$ON,,ON
$STOP,,STOP
$REM,,RLINE
$DIM,,ELOGLN
$DEF,,ELOGLN
$CHANG,,CHGSTR
$RETUR,,RETUR
$RANDO,,STRAN
$RESTO,,RESTOR
$SCRAT,,SCRFIL
$DELIM,,DLIMST
-1,,RLINE
TAB1A: $NUVAR,,VARP1 ;NUMERIC VARIABLE
$STVAR,,STRP1 ;STRING VARIABLE
$NUARR,,LETIND ;ARRAY ELEMENT
$STARR,,LETIND ;STRING ARRAY ELEMENT
0,,ERRKNR ;KEYWORD NOT RECOGNIZED
TAB2: $STFNC,,STFUNC
$STCON,,CONST
$DELIM,,STDL
$STVAR,,CONST
$STARR,,STARIT
$USTFN,,STFUNC
0,,ERRNFO
TAB3: $STFNC,,IFSTR
$STCON,,IFSTR ;LH OF IF IS CONSTANT
$STVAR,,IFSTR ;LH OF IF IS STRING VARIABLE
$STARR,,IFSTR ;LH OF IF IS STRING ARRAY ELEMENT
$USTFN,,IFSTR
0,,IFEXP ;LH OF IF IS EXPRESSION
TAB4: $STFNC,,PRSTR
$STCON,,PRSTR
$DELIM,,PRDLIM
$STVAR,,PRSTR
$STARR,,PRSTR
$USTFN,,PRSTR
-1,,PREN2
0,,PREVAL
TAB5: $STEP,,LPTHRD
-1,,LPNTHR
0,,ERRFMT
TAB6: $NUVAR,,INNUM
$STVAR,,INSTR
$NUARR,,INARR
$STARR,,INARR
0,,ERRINP
TAB7: $INTEG,,CONST
$FLOAT,,CONST
$NUVAR,,CONST
$OPERA,,UNARY
$DELIM,,DLRCRS
$NUFNC,,FUNC
$NUARR,,ARRIT
$UNUFN,,FUNC
0,,ERRNFO
TAB8: $NUVAR,,CNVR
$STFNC,,CSTR
$STCON,,CSTR
$STVAR,,CSTR
$STARR,,CSTR
$USTFN,,CSTR
0,,ERRFMT
TAB9: $STFNC,,LKAHDS
$STCON,,LKAHDS
$STVAR,,LKAHDS
$STARR,,LKAHDS
$USTFN,,LKAHDS
0,,LKAHDN
TABEND: -1,,RLINE
$DELIM,,LNCONT ;BACKSLASH LINE CONTINUATION
0,,ERREND ;EOL NOT FOUND WHERE EXPECTED
;TABLE FOR PASS 1
INS1: JRST GOTNAM ;3
JRST SCNERR ;4
REPEAT 2,<JRST RESC> ;5,6
JRST SCNERR ;7
JRST SCON ;8
JRST RESC ;9
JRST GOTNAM ;10
JRST RESC ;11
REPEAT 3,<JRST SCNERR> ;12-14
REPEAT 2,<JRST GOTARR> ;15,16
INS2: JRST RESC ;30
JRST DATMOD ;31
JRST RESC ;32
TRO F,LUPFLG ;33
JRST DEFMOD ;34
JRST ADDX ;35
JRST DIMEN ;36
JRST FILHNL ;37
SUBTTL COMMAND SCANNING AND FILE INITIALIZATION HOFFMAN 5/74
BAS10: TROA F,CCLENT ;REGULAR ENTRY
TRZ F,CCLENT ;CCL ENTRY
RESET
MOVE [POINT 7,MACBUF] ;ESTABLISH PERMANENT
MOVEM MCBFPT ; POINTERS
MOVE [POINT 7,COMSTR]
MOVEM CMSTPT
MOVEI 75*5
MOVEM MCBFCT
MOVE P,[IOWD STKLEN,PDL] ;SET UP PUSHDOWN LIST
TRZ F,ONEFLG
RERUN: IFE FTDEBUG,<MOVEI PROG+LINLEN*LINBLK-1
CORE ;GET CORE FOR PASS 1
DIE <NOT ENOUGH CORE>>
ANDI F,CCLENT!ONEFLG ;ZERO IRRELEVANT FLAGS
SETZM SRCDEV
SETZM OBJDEV
SETZM LSTDEV
SETZM USRFNC
MOVE [USRFNC,,USRFNC+1]
BLT VARS+571 ;WATCH IT IF STUFF ADDED
;TO LOW SEGMENT
TRNN F,CCLENT ;IF CCL,
JRST CCENT
NONCCL: MOVE BP,[POINT 7,COMSTR] ;IF NOT CCL,
MOVEM BP,CMSTPT ;ENTER COMMAND STRING
OUTSTR [ASCIZ .
*.] ; FROM TTY
CLP: INCHWL
IDPB BP
CAIN LF
JRST BKCH
CAIE ALT
JRST CLP
BKCH: SETZ
IDPB BP
JRST DONIN
CCENT: TROE F,ONEFLG ;IF CCL,
JRST DONIN ; HAVE WE READ IN WHOLE STRING?
MOVE [2,,TMP1] ;NO; TRY TMPCOR
TMPCOR
SKIPA
JRST DONIN ;GOT IT
OPEN 0,OP17 ;NO; TRY DSK
HALT
HLLZ S1,TMPNAM
HLLM S1,TM1
LOOKUP 0,TM1
JRST [TRO F,CCLENT ;NOT THERE EITHER. PRETEND
JRST NONCCL] ; WE WERE ENTERED NORMALLY
IN 0,[IOWD 75,COMSTR
Z]
SKIPA
DIE <CCL INPUT ERROR>
RELEAS 0,
DONIN: MOVE CH,CMSTPT
ISCR: SETZM FILNAM ;SCAN COMMAND STRING
MOVE [FILNAM,,FILNAM+1] ; FROM LAST POINT
BLT LSTNAM+3
MOVEI 1
MOVEM SRCNAM+1
MOVEM OBJNAM+1
MOVEM LSTNAM+1
AFTZ: ILDB CH
CAIN ALT
JRST BRKCHR
CAIE CR
JRST NOTTCR
IBP CH
BRKCHR: MOVE [FILNAM,,SRCNAM] ;IF CR, EAT LF AND
BLT SRCNAM+3 ; PUT FILNAM -> SOURCE NAME
MOVE DEV
MOVEM SRCDEV
JRST GOTALL
NOTTCR: CAIE "←" ;IF = OR ←,
CAIN "="
JRST EQARR
CAIN "," ;IF ","
JRST ISCOM
SOJ CH,
REPEAT 4,<IBP CH> ;IF NONE OF THE ABOVE,
PUSHJ P,FILBRK ; DECREMENT BP AND SCAN
JRST AFTZ ; FOR FILE NAME
ISCOM: TLOE F,COMFLG
JRST ERRIFS
OBJDEF: MOVE [FILNAM,,OBJNAM]
BLT OBJNAM+3
MOVE DEV
MOVEM OBJDEV
CAMN [SIXBIT .TTY.]
TLO F,TTYFLG
JRST ISCR
EQARR: TLOE F,ARRFLG
JRST ERRIFS
TLNN F,COMFLG
JRST OBJDEF
MOVE [FILNAM,,LSTNAM] ;IF , WE HAVE LSTNAM
BLT LSTNAM+3
MOVE DEV
MOVEM LSTDEV
JRST ISCR
GOTALL: MOVEM CH,CMSTPT
SKIPN SRCNAM
SKIPE SRCDEV
SKIPA T1,[SIXBIT .NONAME.]
JRST RERUN
SKIPN SRCNAM
MOVEM T1,SRCNAM
MOVE T1,SRCNAM
SKIPN OBJNAM
MOVEM T1,OBJNAM
MOVSI (SIXBIT .BAS.)
MOVE T1,SRCNAM+1
TRNE T1,1
MOVEM SRCNAM+1
MOVSI (SIXBIT .DSK.)
SKIPN SRCDEV
MOVEM SRCDEV
SKIPN OBJDEV
MOVEM OBJDEV
SKIPN LSTDEV
SKIPN LSTNAM
SKIPA
MOVEM LSTDEV
OPEN 0,OP0 ;GET SRCDEV FOR PROGRAM INPUT
JRST [OUTSTR [ASCIZ .?INPUT DEVICE NOT AVAILABLE
.]
JRST RERUN]
JSP JS,OPNA
EXP IBUF
SETZM ASCNAM
SETZM ASCNAM+1
MOVE BP,[POINT 6,SRCNAM]
MOVE S3,[POINT 7,ASCNAM]
MOVEI C,6
TLP: ILDB CH,BP
JUMPE CH,SJG
ADDI CH,↑O40
IDPB CH,S3
SJG: SOJG C,TLP
LOOKUP 0,SRCNAM ;AND LOOKUP SOURCE
JRST FNF
TRNN F,CCLENT
OUTSTR [ASCIZ .BASIC: .] ;IF CCL SAY "BASIC: FNAME"
OPEN 1,OP1 ;GET OBJDEV FOR OBJECT OUTPUT
JRST [OUTSTR [ASCIZ .?OBJECT DEVICE NOT AVAILABLE
.]
JRST RERUN]
JSP JS,OPNB
EXP OBUF
MOVSI (SIXBIT .MAC.)
MOVE T1,OBJNAM+1
TRNE T1,1
MOVEM OBJNAM+1
ENTER 1,OBJNAM ;ENTER OBJECT FILE
DIE <CANNOT ENTER OBJECT PROGRAM>
PUTSTR [ASCIZ . TITLE .] ;ENTER PROGRAM TITLE
TRNN F,CCLENT
OUTSTR ASCNAM ;AND SAY IT
PUTSTR ASCNAM
TRNN F,CCLENT
OUTSTR CRLF
PUTSTR BGNSTR
SETZB X,ERRCNT
SETZM CURNUM
SETZM STRCT
SETZM FILCNT
MOVE [POINT 7,PROG]
TRNE F,NOSORT
MOVE [POINT 7,DATARE]
MOVEM DATPT
MOVEI S2,PROG+LINLEN*LINBLK-1 ;HIGHEST CORE LOCATION
RESEE: MOVEI C,LINBLK
NXTLIN: MOVE BP,[POINT 7,PROG(X)] ;START NEXT LINE
SETZ S3,
TRZ F,GENFLG
LINELP: SOSGE IBUF+2 ;GET A CHARACTER
JRST GETBFA
ILDB CH,IBUF+1
JUMPE CH,LINELP
CAIE CH,CR ;CR?
JRST PLCHR
TRNN F,GENFLG
SETO S3,
PLCHR: SKIPN S3
IDPB CH,BP
TRO F,GENFLG
CAIE CH,LF
JRST LINELP ;PUT IT AWAY AND GET ANOTHER
SETZ
IDPB BP
SETBP PROG(X) ;UNLESS AT END
TLO F,WNUMFL
PUSHJ P,SCAN
CAIN ST,$INTEG
SKIPE STRING+1
JRST ERRMLN
TRNE F,NOSORT
JRST NSRTE
MOVEM A,CURNUM
ADDI X,LINLEN
SOJG C,NXTLIN
IFE FTDEBUG<MOVEI S1,15*68(S2) ;IF AT END OF BUFFER,
MOVE S2,S1 ;EXPAND CORE AND KEEP
CORE S1,> ;RECORD OF ITS SIZE IN S2
DIE <OUT OF CORE>
JRST RESEE
ERRMLN: OUTSTR [ASCIZ .% MISSING OR BAD LINE NUMBER FOLLOWING LINE .]
MOVE T1,CURNUM
PUSHJ P,DASCOU
OUTSTR CRLF
JRST NXTLIN
EOFA: RELEAS 0, ;AT THE END OF THE SOURCE,
SUBI X,LINLEN
MOVEM X,FINX ;AND PUT AWAY FINAL X
JUMPL X,RERUN
JUMPE X,WSORT
SUBTTL PASS 1 HOFFMAN 4/74
SETZ X,
SORT1: MOVE C,X ;ROUTINE TO SORT STATEMENTS
SORT2: SETBP PROG(C)
TLO F,WNUMFL
PUSHJ P,SCAN
MOVE CH,A
SETBP PROG+LINLEN(C)
TLO F,WNUMFL
PUSHJ P,SCAN
CAMGE CH,A ;COMPARE THE NUMBERS
JRST EOS1 ;ARE THEY IN ORDER?
CAMN CH,A ;NO; SWAP THEM
JRST [SETZM PROG(C)
JRST EOS1]
MOVEI S1,PROG(C)
MOVEI S2,PROG+LINLEN(C)
MOVEI CH,LINLEN
MLP: MOVE A,(S1)
EXCH A,(S2)
MOVEM A,(S1)
AOJ S1,
AOJ S2,
SOJG CH,MLP
SUBI C,LINLEN
JUMPG C,SORT2
EOS1: ADDI X,LINLEN ;CONSIDER NEXT 2 STATEMENTS
CAME X,FINX ;UNLESS DONE
JRST SORT1
WSORT: OPEN 0,OP2 ;GET DSK FOR TMP OUTPUT
HALT
JSP JS,OPNA
EXP OBF
PJOB S1,
MOVEI 3
PLP: IDIVI S1,10
ADDI S2,↑O20
LSHC S2,-6
SOJG 0,PLP
HLLM S3,TMPNAM
ENTER 0,TMPNAM ;ENTER TEMP FILE
DIE <CANNOT ENTER TMPFIL>
SETZ X,
WLP: SKIPN PROG(X) ;PUT AWAY CORRECTED LINES
JRST ADDX
MOVE BP,[POINT 7,PROG(X)]
CHLP: ILDB CH,BP
SOSG OBF+2
JRST PUTBUF
PLCH: IDPB CH,OBF+1
CAIE CH,LF
JRST CHLP
SETBP PROG(X)
TLO F,WNUMFL
PUSHJ P,SCAN
NSRTE: MOVEM A,CURNUM
PUSHJ P,SCAN
CAMN A,[ASCIZ .'.]
JRST ADDX
SKIPA
RESC: PUSHJ P,SCAN ;VARIABLE NAMES
JUMPL ST,ADDX ;IF EOL, JRST ADDX
MOVE T1,ST
CAIL ST,$BGNKY
CAILE ST,$TOPS1
SKIPA
JRST EXEC2
CAIL ST,$NUVAR
CAILE ST,$STARR
JRST RESC
SUBI T1,3
XCT INS1(T1)
JRST RESC
EXEC2: SUBI T1,$BGNKY
XCT INS2(T1)
JRST RESC
SCNERR: OUTSTR PROG(X)
PUTSTR [ASCIZ .;SCANNING ERROR
.]
MOVEI T1,[ASCIZ .?SCANNING ERROR.]
PUSHJ P,ERRDPL
JRST ADDX
SCON: PUTCHR ["S"]
PUSHJ P,DECASC
PUTSTR [ASCIZ/:ASCIZ"/]
PUTSTR STRING
PUTSTR [ASCIZ/"
/]
AOS STRCT
JRST RESC
DATMOD: TRO F,DATFLG
DATMD1: ILDB BP
CAIN " "
JRST DATMD1
SKIPA
DATLP: ILDB BP
CAIN CR
JRST ELINE
IDPB DATPT
JRST DATLP
ELINE: SETZ
IDPB DATPT
IDPB DATPT
SOS DATPT
REPEAT 4,<IBP DATPT>
JRST ADDX
FILHNL: MOVE CH,BP
FILHN1: PUSHJ P,FILBRK
AOS T1,FILCNT
SKIPN FILNAM
SKIPE DEV
SKIPA
JRST FILHN2
PUTCHR ["O"]
PUSHJ P,DCASC1
PUTSTR [ASCIZ": Z
"]
SKIPN T1,DEV
MOVSI T1,(SIXBIT .DSK.)
PUSHJ P,SIXOUT
PUTSTR [ASCIZ" A"]
MOVE T1,FILCNT
PUSHJ P,DCASC1
PUTSTR [ASCIZ",,B"]
MOVE T1,FILCNT
PUSHJ P,DCASC1
PUTSTR [ASCIZ"
C"]
MOVE T1,FILCNT
PUSHJ P,DCASC1
PUTCHR [":"]
MOVE T1,FILNAM
PUSHJ P,SIXOUT
MOVE T1,FILNAM+1
TRNE T1,1
MOVSI T1,(SIXBIT .BAS.)
PUSHJ P,SIXOUT
PUTSTR [ASCIZ" Z
"]
HLRZ T1,FILNAM+3
PUSHJ P,DCASC1
PUTSTR [ASCIZ",,"]
HRRZ T1,FILNAM+3
PUSHJ P,DCASC1
PUTSTR [BYTE (7)CR,LF,CR,LF,0]
FILHN2: ILDB T1,CH
CAIN T1,"\"
JRST RESC
CAIN T1,CR
JRST ADDX
CAIE T1,","
CAIN T1,";"
JRST FILHN1
JRST ERRFMT
DEFMOD: MOVEM BP,PTSTOR
PUSHJ P,SCAN
CAIN ST,$USTFN
JRST DFSTFN
CAIE ST,$UNUFN
JRST ERRBFN
DFNUFN: PUSHJ P,GETARG
PUSHJ P,EVAL
FNCONT: PUTSTR [ASCIZ . MOVE 0,VAL
JRA IO,(IO)
.]
MOVE BP,PTSTOR
TLZ F,FNEVFL
JRST RESC
DFSTFN: PUSHJ P,GETARG
PUSHJ P,STEVAL
JRST FNCONT
GETARG: PUTSTR A
PUTSTR [ASCIZ .: Z
.]
SETZ S1,
FNCTRY: SKIPN USRFNC(S1)
JRST FNCPLC
CAMN A,USRFNC(S1)
JRST ERRFDT
AOJA S1,FNCTRY
FNCPLC: MOVEM A,USRFNC(S1)
SETZM USRARG
MOVE [USRARG,,USRARG+1]
BLT USRARG+14
PUSHJ P,SCAN
CAMN A,[ASCIZ .=.]
POPJ P,
CAME A,[ASCIZ .(.]
JRST ERRFMT
MOVNI S1,15
SETARG: PUSHJ P,SCAN
CAIE ST,$NUVAR
CAIN ST,$STVAR
SKIPA
JRST ERRIFA
PUTSTR [ASCIZ . MOVE @.]
MOVE T1,S1
ADDI T1,15
PUSHJ P,DCASC1
PUTSTR [ASCIZ .(IO)
MOVEM .]
PUTSTR A
PUTSTR [ASCIZ .%#
.]
MOVEM A,USRARG+15(S1)
PUSHJ P,SCAN
CAMN A,[ASCIZ .).]
JRST GTARG2
CAME A,[ASCIZ .,.]
JRST ERRIFA
AOJL S1,SETARG
JRST ERRTLA
GTARG2: PUSHJ P,SCAN
CAME A,[ASCIZ .=.]
JRST ERRFMT
TLO F,FNEVFL
POPJ P,
DIMEN: PUSHJ P,SCAN ;GET VARIABLE NAME
JUMPL ST,ERRDIM
PUSHJ P,PUTPER ;CHANGE IT
PUSHJ P,ADDSYM ;ADD IT TO TABLE
PUTSTR A ;AND WRITE IT IN THE FILE
SETO C, ;SET FLAG
PSUB: SETZ CH,
PUSHJ P,SCAN ;GET (
PUSHJ P,SCAN ;GET FIRST DIMENSION
AOJ A,
SKIPN C
MOVEI A,11 ;= 0/10 IF IMPLIED
MOVEM A,DIM1 ;AND PUT AWAY
RELOOK: PUSHJ P,SCAN
CAMN A,[ASCIZ .,.] ;IS THIS 2-DIMENSIONAL?
JRST DUBL ;YES
CAMN A,[ASCIZ .(.]
AOJ CH,
CAMN A,[ASCIZ .).] ;TERMINATING )
SOJ CH,
JUMPL CH,OKPAR
JUMPL C,ERRDIM
JUMPL ST,ERRDIM
JRST RELOOK
OKPAR: PUTSTR [ASCIZ /: BLOCK /] ;YES; WRITE DIM INTO FILE
MOVE T1,DIM1
PUSHJ P,DCASC1
TRYAGN: PUTSTR CRLF
JUMPE C,[MOVE BP,PTSTOR
JRST RESC]
PUSHJ P,SCAN ;UNLESS DIM STATEMENT
CAMN A,[ASCIZ .\.]
JRST RESC
JUMPG ST,DIMEN ;IN WHICH CASE GOTO DIMEN
JRST ADDX
DUBL: PUSHJ P,SCAN ;GET OTHER DIMENSION
PUTSTR [ASCIZ/.: /] ;ADD ANOTHER PERIOD AND
MOVE T1,DIM1
PUSHJ P,DCASC1
PUTSTR CRLF
PUTSTR [ASCIZ . BLOCK .] ;NEXT, PUT DIMENSIONS
MOVE T1,DIM1
PUSHJ P,DCASC1
PUTCHR ["*"]
JUMPN C,PTSA
PUTSTR [ASCIZ .00011.] ;DEFAULT = 0/10
JRST TRYAGN
PTSA: MOVE T1,A ;COULD BE MOVEI T1,1(A)
AOJ T1, ; BUT WOULD NOT SPOT DIM ERR
PUSHJ P,DCASC1
PUSHJ P,SCAN
JRST TRYAGN
GOTARR: PUSHJ P,PUTPER ;CHANGE SYMBOL'S NAME
GOTNAM: PUSHJ P,ADDSYM ;AND PUT IT INTO TABLE
PUTSTR A ;WRITE IT INTO FILE
CAIL ST,$NUARR
JRST IMPLY ;IF ARRAY, ADD DIMENSIONS
PUTSTR [ASCIZ .:Z
.] ;OTHERWISE, PUT IN ZERO
JRST RESC ;AND TRY FOR ANOTHER
IMPLY: SETZ C,
MOVEM BP,PTSTOR
JRST PSUB
ADDX: TRNE F,NOSORT
JRST NXTLIN
ADDI X,LINLEN ;POINT TO NEXT LINE
CAMG X,FINX
JRST WLP ;IF NOT DONE
ENDPS1: SKIPN FILCNT
JRST ENDPSB
PUTSTR [ASCIZ"IOADR:
"]
MOVEI T2,1
ENDPSA: PUTCHR ["A"]
MOVE T1,T2
PUSHJ P,DCASC1
PUTSTR [ASCIZ": BLOCK 3
B"]
MOVE T1,T2
PUSHJ P,DCASC1
PUTSTR [ASCIZ": BLOCK 3
"]
CAMGE T2,FILCNT
AOJA T2,ENDPSA
ENDPSB: TRNN F,DATFLG
JRST FDAT1
MOVE CH,[POINT 7,PROG] ;STORE DATA FROM STATEMENTS
TRNE F,NOSORT
MOVE CH,[POINT 7,DATARE]
PUTSTR [ASCIZ/
DATA:/]
NLIN: ILDB S1,CH
JUMPE S1,FDAT
PUTSTR [ASCIZ/
ASCIZ←/]
SKIPA
NLIN2: ILDB S1,CH
JUMPN S1,NEND
PUTCHR ["←"]
JRST NLIN
NEND: PUTCHR S1
JRST NLIN2
FDAT: PUTSTR [ASCIZ/
BLOCK 2
/] ;SIGNAL END OF DATA
FDAT1: TRNN F,LUPFLG
JRST NOLUEP
PUTSTR LOOPMC
NOLUEP: PUTSTR [ASCIZ/
PDL: BLOCK 15
START: MOVEI GTSGTB
GETSEG
HALT
MOVE PP,[IOWD 15,PDL]
PUSHJ PP,INITIA
/]
SKIPE FILCNT
PUTSTR [ASCIZ" MOVEI IOADR
MOVEM IOWHER
"]
TRNE F,DATFLG
PUTSTR [ASCIZ . MOVE DBP,[POINT 7,DATA]
.]
RELEAS 0,
SUBTTL PASS 2 HOFFMAN/COURTNEY 4/74
TRO F,PASS2F
IFE FTDEBUG,<MOVEI TXTLIN+LINLEN-1
CORE
DIE <CORE UUO FAILURE>>
OPEN 0,OP3
HALT
JSP JS,OPNA
EXP IBUF
MOVEI S1,TMPNAM
TRNE F,NOSORT
MOVEI S1,SRCNAM
HLLZS 1(S1)
SETZM 2(S1)
SETZM 3(S1)
LOOKUP 0,(S1)
DIE <CANNOT FIND FOR PASS 2>
SETZM STRCT
SETZM LPCOUN
MOVE [IOWD 15,LPSTAK]
MOVEM LPPOIN
RLINE: MOVE BP,[POINT 7,TXTLIN]
RCHAR: SOSGE IBUF+2
JRST GETBFB
ILDB CH,IBUF+1
JUMPE CH,RCHAR
IDPB CH,BP
CAIE CH,LF
JRST RCHAR
SETZB 0,NEWCT
SETZM CHRCT
IDPB BP
MOVE BP,[POINT 7,TXTLIN]
MOVEM P,PDLTMP
TLO F,WNUMFL
PUSHJ P,SCAN ;GET LINE NUMBER
PUTCHR ["L"] ;WRITE OBJECT CODE: LABEL
MOVE T1,A
MOVEM T1,CURNUM
PUSHJ P,DCASC1
MOVE A,STRING
PUTSTR [ASCIZ/:; /]
PUTSTR TXTLIN
NLNUM: PUSHJ P,SCAN ;GET NEXT ITEM FROM SOURCE CODE
GOTO TAB1 ;BRANCH THROUGH TABLE#1
DLIMST: CAMN A,[ASCIZ .\.]
JRST RLINE
CAMN A,[ASCIZ .'.]
JRST RLINE
JRST ERRKNR
LETT: PUSHJ P,SCAN
GOTO TAB1A
VARP1: MOVE S2,A ;WE HAVE A VARIABLE; MOVE TO TMP
VARP1A: PUSHJ P,SCAN ;GET NEXT ITEM OF SOURCE CODE
CAME A,[ASCIZ/=/] ;IS IT "="?
JRST ERRKNR ;N - ERROR
PUSHJ P,EVAL ;Y- EXPRESSION MUST FOLLOW
LETCON: PUTSTR [ASCIZ . MOVEM VAL,.]
PUTSTR S2
TLZN F,INXFLG
JRST NOTARY
PUTSTR [ASCIZ".(.X2)"]
NOTARY: PUTSTR CRLF
PUSHJ P,SCAN ;GET NEXT ITEM FROM SOURCE CODE
GOTO TABEND ;BRANCH
LETIND: MOVE S1,ST
PUSH P,A
PUSHJ P,INDEX
POP P,S2
TLO F,INXFLG
CAIN S1,$NUARR
JRST VARP1A
SKIPA
STRP1: MOVE S2,A ;WE HAVE A STRING VARIABLE; MOVE TO TMP
PUSHJ P,SCAN ;GET NEXT ITEM FROM SOURCE CODE
CAME A,[ASCIZ/=/] ;IS IT "="?
JRST ERRKNR ;N- ERROR
PUSHJ P,STEVAL
JRST LETCON
GO2: PUSHJ P,SCAN ;WE HAVE A GO2; MUST BE FOLLOWED BY INTEGER
CAIE ST,$INTEG ;IS IT?
JRST ERRNIA ;N- ERROR
PUTSTR [ASCIZ/ JRST L/] ;Y- WRITE OUTPUT CODE
EOGO2: MOVE T1,A
PUSHJ P,DCASC1
PUTSTR CRLF
PUSHJ P,SCAN ;GET NEXT ITEM OF SOURCE CODE
GOTO TABEND ;BRANCH
GOSUB: PUSHJ P,SCAN ;GOSUB
CAIE ST,$INTEG ;(SAME IDEA AS GO2)
JRST ERRNIA
PUTSTR [ASCIZ/ PUSHJ PP,L/]
JRST EOGO2
RETUR: PUTSTR [ASCIZ/ POPJ PP,
/]
PUSHJ P,SCAN
GOTO TABEND
STOP: PUTSTR [ASCIZ/ EXIT
/]
PUSHJ P,SCAN
GOTO TABEND
ON: PUSHJ P,EVALI ;EVALUATE EXPRESSION FOR RANGE COMPARISON
PUTSTR [ASCIZ/ JRST .(VAL)
/]
SETZ S1,
REHOP: PUSHJ P,SCAN
CAIE ST,$GOTO
CAIN ST,$THEN
JRST HOP
JUMPN S1,ERRGTE
CAME A,[ASCIZ .,.]
JRST ERRGTE
SETO S1,
JRST REHOP
HOP: PUSHJ P,SCAN ;NEED INTEGER FOR DESTINATION ADDR.
CAIE ST,$INTEG ;HAVE ONE?
JRST ERRNIA ;N- ERROR
PUTSTR [ASCIZ/ JRST L/] ;Y- WRITE OBJECT CODE
MOVEI T1,(A)
PUSHJ P,DCASC1
PUTSTR CRLF
PUSHJ P,SCAN ;GET NEXT ITEM
CAMN A,[ASCIZ/,/] ;MORE LINE NUMBERS?
JRST HOP ;Y- PROCESS THEM
GOTO TABEND
IF: SETZ S2,
PUSHJ P,SCAN
GOTO TAB3
IFEXP: PUSHJ P,STAKBK
PUSHJ P,EVAL ;EVALUATE FIRST EXPRESSION
PUTSTR [ASCIZ . MOVE BP,VAL
.]
PUSHJ P,RLCOMP
PUSHJ P,EVAL
TRNE F,IEQFLG
MOVE S1,[ASCIZ .N.]
TRNE F,IGTFLG
MOVE S1,[ASCIZ .GE.]
TRNE F,ILTFLG
MOVE S1,[ASCIZ .LE.]
TRNE F,IGTFLG
TRNN F,ILTFLG
SKIPA
MOVE S1,[ASCIZ .E.]
TRNE F,IGTFLG
TRNN F,IEQFLG
SKIPA
MOVE S1,[ASCIZ .G.]
TRNE F,ILTFLG
TRNN F,IEQFLG
SKIPA
MOVE S1,[ASCIZ .L.]
PUTSTR [ASCIZ . CAM.]
PUTSTR S1
PUTSTR [ASCIZ . VAL,BP
.]
IFKWD: PUSHJ P,SCAN ;GET NEXT ITEM OF SOURCE CODE
CAIE ST,$GOTO
CAIN ST,$THEN
JRST GO2
JUMPN S2,ERRKNR
CAMN A,[ASCIZ .,.]
SOJA S2,IFKWD
JRST ERRKNR
IFSTR: PUSHJ P,STAKBK
PUSHJ P,STEVAL
PUTSTR [ASCIZ" MOVE BP,VAL
"]
PUSHJ P,RLCOMP
PUSHJ P,STEVAL
IFSTR2: PUSHJ P,SCAN ;GET NEXT ITEM OF SOURCE CODE
CAIE ST,$GOTO
CAIN ST,$THEN
JRST GOTOO1
JUMPN S2,ERRKNR
CAME A,[ASCIZ .,.]
JRST ERRKNR
SOJA S2,IFSTR2
GOTOO1: PUSHJ P,SCAN
CAIE ST,$INTEG
JRST ERRNIA
MOVEM A,SCSNUM
PUTSTR [ASCIZ . PUSHJ PP,IFSTR
.]
TRZE F,ILTFLG
PUSHJ P,SUCESS
PUSHJ P,FAIL
TRZE F,IGTFLG
PUSHJ P,SUCESS
PUSHJ P,FAIL
TRZE F,IEQFLG
PUSHJ P,SUCESS
PUSHJ P,FAIL
PUTCHR ["I"]
MOVE T1,CURNUM
PUSHJ P,DCASC1
PUTCHR [":"]
PUSHJ P,SCAN
GOTO TABEND
SUCESS: PUTSTR [ASCIZ . JRST L.]
MOVE T1,SCSNUM
PUSHJ P,DCASC1
PUTSTR CRLF
POP P,T1
JRST 1(T1)
FAIL: PUTSTR [ASCIZ . JRST I.]
MOVE T1,CURNUM
PUSHJ P,DCASC1
PUTSTR CRLF
POPJ P,
RLCOMP: TRZ F,ILTFLG!IGTFLG!IEQFLG
RLCOM1: TRNE F,IGTFLG
TRNN F,ILTFLG
SKIPA
POPJ P,
PUSHJ P,SCAN
CAME A,[ASCIZ .=.]
JRST RLNTEQ
TRO F,IEQFLG
POPJ P,
RLNTEQ: TRNE F,IGTFLG
JRST STAKBK
CAME A,[ASCIZ .>.]
JRST RLNTGT
TRO F,IGTFLG
JRST RLCOM1
RLNTGT: TRNE F,IGTFLG!ILTFLG
JRST STAKBK ;PUSHJ P,STAKBK; POPJ P,
CAME A,[ASCIZ .<.]
JRST STAKBK
TRO F,ILTFLG
JRST RLCOM1
PRNT: SETZ S1,
TRZ F,GENFLG
PUSHJ P,SCAN
CAME A,[ASCIZ .#.]
JRST PRNXT1
PUSHJ P,EVALI
PUTSTR [ASCIZ" ADD IO,VAL
"]
TRO F,GENFLG
PUSHJ P,SCAN
CAME A,[ASCIZ .,.]
CAMN A,[ASCIZ .:.]
JRST PRNXT
JUMPL ST,PREN3
SKIPA
PRNXT: PUSHJ P,SCAN
PRNXT1: CAMN A,[ASCIZ .TAB.]
JRST PRTAB
GOTO TAB4
PRDLIM: CAMN A,[ASCIZ .\.]
JRST PREN2
CAMN A,[ASCIZ .;.]
JRST PREND
CAME A,[ASCIZ .,.]
JRST PREVAL
PUTSTR [ASCIZ . PUSHJ PP,PRCOM
.]
JRST PREND
PRTAB: PUSHJ P,SCAN
PUSHJ P,EVALI
PUSHJ P,SCAN
PUTSTR [ASCIZ . PUSHJ PP,PRTAB
.]
JRST PREVA1
PREVAL: CAIE S1,$NUVAR
CAIN S1,$STVAR
JRST ERRMSD
PUSHJ P,STAKBK
PUSHJ P,EVAL
PUTSTR [ASCIZ % PUSHJ PP,TFLOT
%]
PREVA1: MOVEI S1,$NUVAR
JRST PRNXT
PRSTR: MOVE S1,ST
PUSHJ P,STAKBK
PUSHJ P,STEVAL
PUTSTR [ASCIZ % PUSHJ PP,PRSTR
%]
JRST PRNXT
PREND: MOVE S1,ST
JRST PRNXT
PREN2: CAIE S1,$DELIM
PREN3: PUTSTR [ASCIZ % PUSHJ PP,PCRLF
%]
TRZE F,GENFLG
PUTSTR [ASCIZ % HRRZ IO,RLC
%]
GOTO TABEND
FORLP: PUSHJ P,SCAN
CAIE ST,$NUVAR
JRST ERRILP
MOVEM A,VAR
PUSHJ P,SCAN
CAME A,[ASCIZ/=/]
JRST ERRFMT
PUTSTR MOVEI.
PUTSTR [ASCIZ/.L,/]
MOVE T1,LPCOUN
PUSHJ P,DCASC1
PUTSTR CRLF
PUSHJ P,EVAL
PUTSTR MOVEM.
PUTSTR VALCOM
PUTSTR [ASCIZ/LP1(.L)
/]
PUSHJ P,SCAN
CAIE ST,$TO
JRST ERRFMT
PUSHJ P,EVAL
PUTSTR MOVEM.
PUTSTR VALCOM
PUTSTR [ASCIZ/LP2(.L)
/]
PUSHJ P,SCAN
GOTO TAB5
LPTHRD: PUSHJ P,EVAL
PUTSTR [ASCIZ" MOVEM VAL,LP3(.L)
"]
PUSHJ P,SCAN
JRST LPCONT
LPNTHR: PUTSTR [ASCIZ" MOVE [1.0]
MOVEM LP3(.L)
"]
LPCONT: MOVE S3,LPPOIN
MOVE S2,VAR
HRR S2,LPCOUN
PUSH S3,S2
MOVEM S3,LPPOIN
PUTSTR LOOP.
PUTSTR VAR
PUTCHR [","]
MOVE T1,LPCOUN
PUSHJ P,DCASC1
PUTSTR CRLF
AOS LPCOUN
GOTO TABEND
ENDLP: PUSHJ P,SCAN
CAIE ST,$NUVAR
JRST ERRFMT
MOVE S2,LPPOIN
POP S2,S3
MOVEM S2,LPPOIN
HLLZM S3,VAR
HRRZS S3
CAME A,VAR
JRST ERRINL
PUTSTR [ASCIZ/ EOLOOP /]
MOVE T1,S3
PUSHJ P,DCASC1
PUTSTR CRLF
PUSHJ P,SCAN
GOTO TABEND
STRAN: PUTSTR [ASCIZ" MSTIME .T1,
JSA IO,SETRAN##
JUMP .T1
"]
; PUSHJ P,SCAN
; GOTO TABEND
JRST ELOGLN
REED: TRNE F,DATFLG
JRST YESDAT
PUTSTR [ASCIZ . JRST [OUTSTR [ASCIZ+
OUT OF DATA
+]
EXIT]
.]
JRST RLINE
YESDAT: TRO F,READFL
JRST INPT2
INPT: TRZ F,READFL!GENFLG
PUTSTR [ASCIZ" PUSH PP,DBP
"]
PUSHJ P,SCAN
CAME A,[ASCIZ .#.]
JRST NOTINF
PUSHJ P,EVALI
PUTSTR [ASCIZ" ADDI IO,(RLC)
MOVEI ERRRD
MOVEM RESTRT
"]
TRO F,GENFLG
PUSHJ P,SCAN
CAME A,[ASCIZ .,.]
CAMN A,[ASCIZ .:.]
JRST INPOK
JRST ERRFMT
NOTINF: PUTSTR [ASCIZ" MOVEI .+2
MOVEM RESTRT
"]
PUSHJ P,STAKBK
INPOK: PUTSTR [ASCIZ" SETZM INPFLG
"]
JRST INPT2
NXTVAR: PUSHJ P,SCAN
JUMPL ST,INPDON
CAME A,[ASCIZ .,.]
JRST ERRFMT
INPT2: PUSHJ P,SCAN
MOVEM ST,ISTATE
TRNN F,READFL
PUTSTR [ASCIZ . PUSHJ PP,INPTB
.]
TRNE F,READFL
PUTSTR [ASCIZ . PUSHJ PP,SCANB
.]
GOTO TAB6
INNUM: PUTSTR [ASCIZ . CAIE ST,3
.]
TRNE F,READFL!GENFLG
PUTSTR [ASCIZ . JRST ERRRD
.]
TRNN F,READFL!GENFLG
PUTSTR [ASCIZ . PUSHJ PP,ERRNCF
.]
PUTSTR MOVEM.
PUTSTR [ASCIZ".T4,"]
INSCNT: PUTSTR A
PUTSTR CRLF
JRST NXTVAR
INSTR: PUTSTR [ASCIZ . PUSHJ PP,INSUB
MOVEM BP,.]
JRST INSCNT
INSTAR: PUTSTR [ASCIZ . PUSHJ PP,INSUB
MOVEM BP,.]
JRST INCONT
INARR: PUSH P,A
PUSHJ P,INDEX
POP P,A
MOVE ISTATE
CAIE $NUARR
JRST INSTAR
PUTSTR [ASCIZ . CAIE ST,3
.]
TRNN F,READFL
JRST NOTRD2
PUTSTR [ASCIZ . JRST ERRRD
.]
SKIPA
NOTRD2: PUTSTR [ASCIZ . PUSHJ PP,ERRNCF
.]
PUTSTR MOVEM.
PUTSTR [ASCIZ".T4,"]
INCONT: PUTSTR A
PUTSTR [ASCIZ ".(.X2)
"]
JRST NXTVAR
INPDON: TRNE F,READFL
JRST INPEND
PUTSTR [ASCIZ . POP PP,DBP
.]
INPEND: TRNE F,GENFLG
PUTSTR [ASCIZ % HRRZ IO,RLC
%]
GOTO TABEND ;COULD BE JRST RLINE
RESTOR: PUSHJ P,SCAN
CAME A,[ASCIZ .#.]
CAIN ST,$INTEG
JRST RSTFIL
TRNN F,DATFLG
JRST ERRNDT
PUTSTR [ASCIZ . MOVE DBP,[POINT 7,DATA]
.]
GOTO TABEND
SCRFIL: PUSHJ P,SCAN
TROA F,GENFLG
RSTFIL: TRZ F,GENFLG
RSTFI1: CAIE ST,$INTEG
PUSHJ P,SCAN
CAIE ST,$INTEG
JRST ERRFMT
PUTSTR [ASCIZ" OPEN "]
MOVE T1,A
PUSHJ P,DCASC1
PUTSTR [ASCIZ",O"]
MOVE T1,A
PUSHJ P,DCASC1
PUTSTR [ASCIZ"
JRST [OUTSTR [ASCIZ .?CANNOT INIT DEVICE
.]
EXIT]
HLLZS C"]
MOVE T1,A
PUSHJ P,DCASC1
PUTSTR [ASCIZ"+1
SETZM C"]
MOVE T1,A
PUSHJ P,DCASC1
PUTSTR [ASCIZ"+2
"]
TRNE F,GENFLG
PUTSTR [ASCIZ"ENTER "]
TRNN F,GENFLG
PUTSTR [ASCIZ"LOOKUP "]
MOVE T1,A
PUSHJ P,DCASC1
PUTSTR [ASCIZ",C"]
MOVE T1,A
PUSHJ P,DCASC1
PUTSTR [ASCIZ"
JRST [OUTSTR [ASCIZ .?CANNOT "]
TRNE F,GENFLG
PUTSTR [ASCIZ"ENTER"]
TRNN F,GENFLG
PUTSTR [ASCIZ"FIND"]
PUTSTR [ASCIZ" FILE
.]
EXIT]
"]
PUSHJ P,SCAN
CAME A,[ASCIZ .,.]
CAMN A,[ASCIZ .;.]
SKIPA
GOTO TABEND
PUSHJ P,SCAN
JRST RSTFI1
CHGSTR: PUSHJ P,SCAN
GOTO TAB8
CNVR: PUTSTR [ASCIZ" FIX .T4,"]
PUTSTR A
PUTSTR [ASCIZ".
"]
PUTSTR CHGTXT
PUTSTR A
PUTSTR [ASCIZ".(.X)
FIX 0,.T3
IDPB .T1
AOJ .X,
SOJG .T4,.-5
SETZ .X,
IDPB .X,.T1
"]
PUSHJ P,SCAN
CAIE ST,$TO
JRST ERRFMT
PUSHJ P,SCAN
CAIE ST,$STVAR
JRST ERRFMT
PUTSTR [ASCIZ" MOVEM .T2,"]
PUTSTR A
PUTSTR CRLF
PUSHJ P,SCAN
GOTO TABEND
CSTR: PUSHJ P,STAKBK
PUSHJ P,STEVAL
PUSHJ P,SCAN
CAIE ST,$TO
JRST ERRFMT
PUSHJ P,SCAN
CAIE ST,$NUVAR
JRST ERRFMT
PUTSTR [ASCIZ" HRLI VAL,↑O440700
SETZ .X,
ILDB .T3,VAL
JUMPE .T3,.+4
FSC .T3,↑O233
MOVEM .T3,"]
PUTSTR A
PUTSTR [ASCIZ".+1(.X)
AOJA .X,.-4
FSC .X,↑O233
MOVEM .X,"]
PUTSTR A
PUTSTR [ASCIZ".
"]
PUSHJ P,SCAN
GOTO TABEND
LNCONT: CAME A,[ASCIZ .\.]
JRST ERREND
JRST NLNUM
ELOGLN: MOVEI T1,ADDX
MOVEI T2,RESC
TRNN F,PASS2F
JRST ELOGL1
MOVEI T1,RLINE
MOVEI T2,NLNUM
ELOGL1: PUSHJ P,SCAN
JUMPL ST,(T1)
CAMN A,[ASCIZ .\.]
JRST (T2)
JRST ELOGL1
INDEX: PUSHJ P,SCAN
PUSHJ P,EVALI
PUTSTR MOVE.
PUTSTR [ASCIZ".X2,VAL
"]
PUSHJ P,SCAN
CAMN A,[ASCIZ/)/]
POPJ P,
CAME A,[ASCIZ .,.]
JRST ERRIVS
PUTSTR [ASCIZ" PUSH PP,.X2
"]
PUSHJ P,EVALI
PUTSTR [ASCIZ" POP PP,.X2
IMUL VAL,"]
MOVE T2,-1(P)
MOVE Z,[POINT 7,T2]
ILDB Z
JUMPN .-1
MOVEI "."
DPB Z
MOVEM T2,-1(P)
PUTSTR T2
PUTSTR [ASCIZ".
ADD .X2,VAL
AOJ .X2,
"]
PUSHJ P,SCAN
CAME A,[ASCIZ/)/]
JRST ERRIVS
POPJ P,
ERROUT: OUTSTR TXTLIN
PUSHJ P,ERRDPL
MOVE P,PDLTMP
TRNN F,PASS2F
JRST ADDX
JRST RLINE
ERRDPL: SKIPG C,CHRCT
JRST ERRARO
OUTCHR [" "]
SOJG C,.-1
ERRARO: OUTSTR [ASCIZ"↑
"]
OUTCHR ["?"]
TLNN F,TTYFLG
OUTSTR (T1)
PUTCHR [";"]
PUTSTR (T1)
PUTSTR CRLF
OUTSTR [ASCIZ/ IN LINE /]
MOVE T1,CURNUM
PUSHJ P,DASCOU
OUTSTR CRLF
AOS ERRCNT
POPJ P,
SUBTTL END OF SOURCE / CALL MACRO HOFFMAN 5/74
EOFB: PUTSTR [ASCIZ/
EXIT.:: EXIT
/]
SKIPN T1,LPCOUN
JRST ENDSRC
PUTSTR [ASCIZ/LP1: BLOCK /]
PUSHJ P,DCASC1
PUTSTR [ASCIZ/
LP2: BLOCK /]
MOVE T1,LPCOUN
PUSHJ P,DCASC1
PUTSTR [ASCIZ/
LP3: BLOCK /]
MOVE T1,LPCOUN
PUSHJ P,DCASC1
ENDSRC: PUTSTR [ASCIZ/
END START
/]
SETZM TMPNAM
TRNN F,NOSORT
RENAME TMPNAM
JFCL
RELEAS 0,
RELEAS 1,
SKIPE ERRCNT
JRST ERHNDL
MOVE T1,OBJDEV
DEVCHR T1,
SETCA T1,
TDNE T1,[2,,↑O10000]
JRST RERUN
MOVE BP,MCBFPT
MOVNI 10
ADDM IWD
SIXMOV OBJDEV
MOVEI ":"
IDPB BP
SIXMOV OBJNAM
SKIPN LSTDEV
JRST NOLSTT
MOVEI ","
IDPB BP
SIXMOV LSTDEV
SIXMOV LSTNAM
MOVEI "."
IDPB BP
SIXMOV LSTNAM+1
NOLSTT: MOVEI "="
IDPB BP
SIXMOV OBJDEV
MOVEI ":"
IDPB BP
SIXMOV OBJNAM
MOVEI "."
IDPB BP
HLLZ OBJNAM+1
SIXMOV
MOVEI S2,CR
IDPB S2,BP
MOVEI S2,LF
IDPB S2,BP
MOVEM BP,MCBFPT
TRNN F,CCLENT
JRST RERUN
EOJA: MOVE BP,MCBFPT
CAME BP,[POINT 7,MACBUF]
JRST NOERRS
TRNN F,CCLENT
EXIT
JRST ERRIF1
NOERRS: TRNN F,EOJFLG
JRST NOLOAD
REMAC LOADER
JRST CCLADD
NOLOAD: TRNN F,CCLENT
JRST PASTBS
REMAC BAS10
CCLADD: MOVNI 2
ADDM IWD
PASTBS: MOVE [3,,MACTMP]
HRLZ Z,IWD
HRRI Z,MACBUF-1
MOVEM Z,IWD
TMPCOR
SKIPA
JRST OK2
MOVSI S1,(SIXBIT .MAC.)
MOVEM S1,TM1
HLLZ S1,TMPNAM
HLLM S1,TM1
MOVSI S1,(SIXBIT .TMP.)
MOVEM S1,TM1+1
SETZM TM1+2
SETZM TM1+3
OPEN 0,OP17
HALT
ENTER 0,TM1
DIE <CANNOT ENTER MACTMP>
OUT 0,IWD
SKIPA
DIE <MACTMP OUTPUT ERROR>
OK2: MOVE [1,,RUNBLK]
RUN
HALT
ERHNDL: OUTCHR ["?"]
MOVE T1,ERRCNT
PUSHJ P,DASCOU
OUTSTR [ASCIZ . ERRORS DETECTED
.]
JRST RERUN
GETBFB: IN 0,
JRST RCHAR
JRST EOFB
GETBFA: IN 0, ;SUBROUTINE TO INPUT
JRST LINELP ;A BUFFER FROM THE SOURCE
TRNN F,NOSORT
JRST EOFA
JRST ENDPS1
PUTBUF: OUT 0, ;TO OUTPUT BUFFER TO TEMP
JRST PLCH
DIE <OUTPUT ERROR ON TMPFIL>
SUBTTL COMMAND SCANNER HOFFMAN 11/72
EXTN=FILNAM+1
PPN=FILNAM+3
ZERSUB: MOVE Z,[POINT 6,S3]
SETZB T1,S3
POPJ P,
COMSUB: CAIN "!"
JRST [MOVEI T2,RUNIT
JRST (S1)]
CAIE CR
CAIN ","
JRST [MOVEI T2,EOJF
JRST (S1)]
CAIE "="
CAIN "←"
JRST [MOVEI T2,EOJF
JRST (S1)]
CAIN ALT
JRST [MOVEI T2,EOJF
JRST (S1)]
CAIN "["
JRST [MOVEI T2,GTPROJ
JRST (S1)]
CAIE "."
JRST 2(S1)
MOVEI T2,GTEXT
JRST (S1)
FSUB: JSP S1,COMSUB
MOVEM S3,FILNAM
JRST (T2)
CAIL T1,6
JRST .+3
SUBI ↑O40
IDPB Z
AOJA T1,(S2)
FILBRK: SETZM DEV
MOVEI S2,1
MOVEM S2,EXTN
PUSHJ P,ZERSUB
MOVEI S2,.+1
PUSHJ P,GTCMCH
JUMPE EOJA
CAIE ":"
JRST FSUB
MOVEM S3,DEV
PUSHJ P,ZERSUB
MOVEI S2,.+1
PUSHJ P,GTCMCH
JRST FSUB
GTEXT: PUSHJ P,ZERSUB
PUSHJ P,GTCMCH
JSP S1,COMSUB
MOVEM S3,EXTN
JRST (T2)
CAIL T1,3
JRST .+3
SUBI ↑O40
IDPB Z
AOJA T1,GTEXT+1
GTPROJ: SETZB T1,T2
PUSHJ P,GTCMCH
CAIN ","
JRST GTPROG
SUBI "0"
CAILE 7
JRST ERRIFS
ASH T2,3
JOV ERRIFS
HRLZS
ADD T2,
JOV ERRIFS
JRST GTPROJ+1
GTPROG: PUSHJ P,GTCMCH
CAIE CR
CAIN "]"
JRST COMBIN
SUBI "0"
CAILE 7
JRST ERRIFS
ASH T1,3
JOV ERRIFS
HRLZS
ADD T1,
JOV ERRIFS
JRST GTPROG
COMBIN: HLR T2,T1
MOVEM T2,PPN
POPJ P,
EOJF: REPEAT 4,<IBP CH>
SOJ CH,
POPJ P,
GTCMCH: ILDB CH
CAIN " "
JRST GTCMCH
CAIE "/"
POPJ P,
ILDB CH
CAIE "N"
JRST ERRBDS
TRO F,NOSORT
JRST GTCMCH
ERRBDS: OUTSTR [ASCIZ .?UNRECOGNIZABLE SWITCH ".]
OUTCHR
OUTSTR [ASCIZ ."
.]
TRNE F,CCLENT
JRST ERRIF1
CLRBFI
EXIT
ERRIFS: OUTSTR [ASCIZ/?IMPROPER FILE SPEC
/]
ERRIF1: MOVE [SIXBIT .BAS10.]
MOVEM FILNAM
RUNIT: MOVSI (SIXBIT .SYS.)
MOVEM RBLOCK
MOVE FILNAM
CAMN [SIXBIT .LOADER.]
TRNE F,CCLENT
JRST DORUN
TRO F,EOJFLG
JRST EOJA
DORUN: MOVEM RBLOCK+1
MOVE [1,,RBLOCK]
RUN
HALT
SUBTTL SUBROUTINES HOFFMAN 5/74
OPNA: MOVE [↑O400000,,BUFA1+1]
SKIPA
OPNB: MOVE [↑O400000,,BUFB1+1]
MOVE S1,(JS)
MOVEM (S1)
MOVE [POINT 7,0,35]
MOVEM 1(S1)
JRST 1(JS)
PUTPER: MOVE S1,[POINT 7,A] ;TO CHANGE VARIABLE NAME
SLP: ILDB S2,S1
JUMPN S2,SLP
MOVEI S2,"."
DPB S2,S1
POPJ P,
ADDSYM: SETZ S1, ;TO ADD TO VARS LIST
POP P,Z
VARLP: SKIPN VARS(S1)
JRST EOVARS
CAMN A,VARS(S1)
JRST RESC
AOJA S1,VARLP
EOVARS: MOVEM A,VARS(S1)
JRST (Z)
FNF: OUTCHR ["?"]
OUTSTR ASCNAM
OUTCHR ["."]
MOVE BP,[POINT 6,SRCNAM+1]
MOVEI C,3
FLP: ILDB BP
JUMPE EOLOOP
ADDI ↑O40
OUTCHR
EOLOOP: SOJG C,FLP
OUTSTR [ASCIZ/ NOT FOUND
/]
SETZM SRCNAM
MOVE [SRCNAM,,SRCNAM+1]
BLT LSTNAM+3
JRST RERUN
SIXADD: MOVE S1,(JS)
MOVEI C,6
SIXLUP: ILDB S2,S1
JUMPE S2,1(JS)
ADDI S2,↑O40
IDPB S2,BP
SOJG C,SIXLUP
JRST 1(JS)
STAKBK: MOVE BP,OLDPT
MOVE OLDCT
EXCH CHRCT
MOVEM NEWCT
POPJ P,
SIXOUT: PUTSTR [ASCIZ" SIXBIT/"]
MOVE T2,[POINT 6,T1]
MOVEI C,6
SIXOU1: ILDB A,T2
JUMPE A,SIXOU2
ADDI A,↑O40
PUTCHR A
SOJG C,SIXOU1
SIXOU2: PUTSTR [ASCIZ"/
"]
POPJ P,
DASCOU: PUSH P,C
SETZ C,
DVLOOP: IDIVI T1,10
ADDI T2,"0"
PUSH P,T2
AOJ C,
JUMPG T1,DVLOOP
SPOP: POP P,T1
OUTCHR T1
SOJG C,SPOP
POP P,C
POPJ P,
DECASC: MOVE T1,STRCT
DCASC1: PUSH P,C
PUSH P,T2
MOVEI C,5
DIVIDE: IDIVI T1,10
ADDI T2,"0"
PUSH P,T2
SOJG C,DIVIDE
MOVEI C,5
STKPOP: POP P,T1
PUTCHR T1
SOJG C,STKPOP
POP P,T2
POP P,C
POPJ P,
SUBTTL UUO DISPATCH ROUTINES & LUUOS HOFFMAN 7/74
RADIX 8
UUODIS: LDB [POINT 9,40,8]
CAIN 1
JRST PUTC
CAIN 2
JRST PUTS
CAIN 3
JRST TRANSF
CAIN 4
JRST FIXIT
CAIN 5
JRST FLOTIT
CAIN 6
JRST OCTOU1
CAIN 7
JRST OCTOU2
OUTSTR [ASCIZ .% UUO ERROR
.]
EXIT
PUTS: HRRZ Z,40
OR Z,[POINT 7,0]
GLP: ILDB Z
SKIPN 0
POPJ P,
PUSHJ P,PUTC1
JRST GLP
PUTC: HRRZ @40
PUTC1: SOSG OBUF+2
JRST PUTB
PUTC2: IDPB OBUF+1
POPJ P,
PUTB: OUT 1, ;OUTPUTS TO OBJECT
JRST PUTC2
OUTSTR [ASCIZ .OBJECT OUTPUT ERROR.]
EXIT
TRANSF: HRRZ Z,40 ;TRANSFER ROUTINE FOR TABLE LOOKUP
POP P, ;JUNK
TRLOOP: HLRE 0,(Z)
JUMPE 0,TRDISP
CAMN 0,ST
JRST TRDISP
AOJA Z,TRLOOP
TRDISP: HRRZ Z,(Z)
JRST (Z)
FIXIT: MOVE 0,@40
MULI 0,400
EXCH 0,Z
JUMPGE Z,FIXIT1
TRC Z,-1
MOVNS 0
FIXIT1: ASH 0,-243(Z)
SKIPGE Z
MOVNS 0
JRST RETARG
FLOTIT: MOVE 0,@40
HLRE Z,0
HLL 0,Z
FSC 0,233
SKIPGE 0
AOJE Z,FLOTI1
FSC Z,255
FADR 0,Z
FLOTI1: ;JRST RETARG
RETARG: LDB Z,[POINT 4,40,12]
MOVEM 0,(Z)
POPJ P,
OCTOU1: SKIPA Z,[POINT 3,@40]
OCTOU2: MOVE Z,[POINT 3,@40,17]
PUSH P,T1
MOVEI T1,6
OCTBOT: ILDB 0,Z
ADDI 0,"0"
PUSHJ P,PUTC1
SOJG T1,OCTBOT
POP P,T1
POPJ P,
END BAS10